深入分析驴子系列 (3)emule CStatForServer 类分析
CStatForServer 本类的作用是计算平均速率
void CStatForServer::RecordCurrentRate(float uploadrate, float downloadrate)
{
// if reach record interval
DWORD dwCurTime = GetTickCount();
if (dwCurTime - m_dwLastRecordTime < RECORD_INTERVAL_MS)
return;
m_dwLastRecordTime = dwCurTime;
if (ULONG_MAX != m_ulRecordTimes_Download
&& IsAnyTaskRunning())
{
m_ulRecordTimes_Download++; // 次数加一
m_fAverageDownloadSpeed = m_fAverageDownloadSpeed + ((downloadrate - m_fAverageDownloadSpeed) / m_ulRecordTimes_Download ); // 这点可能难理解
}
if (ULONG_MAX != m_ulRecordTimes_Upload)
{
m_ulRecordTimes_Upload++;
m_fAverageUploadSpeed = m_fAverageUploadSpeed + ( (uploadrate - m_fAverageUploadSpeed) / m_ulRecordTimes_Upload);
}
m_fAverageDownloadSpeed = m_fAverageDownloadSpeed + ((downloadrate - m_fAverageDownloadSpeed) / m_ulRecordTimes_Download );
这个算法不太好懂,它的意思是前面n-1次的avg值,然后现在有了第n次的实际值,开始算第n次的avg值
这样计算的结果与所有次的值累加起来然后除以次数结果是一样的。
他这个算法是根据数学公式运算简化后的结果
m_fAverageDownloadSpeed*m_ulRecordTimes_Download=m_fAverageDownloadSpeed*m_ulRecordTimes_Download+downloadrate - m_fAverageDownloadSpeed;
》》 原计算公式两边都乘以次数
m_fAverageDownloadSpeed*m_ulRecordTimes_Download="所有次的累加和"
m_fAverageDownloadSpeed*m_ulRecordTimes_Download+downloadrate - m_fAverageDownloadSpeed
=m_fAverageDownloadSpeed*(m_ulRecordTimes_Download-1)+downloadrate;
》》 前n-1次的平均值*次数+本次的速度等于所有次的累加和