深入分析驴子系列 (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次的平均值*次数+本次的速度等于所有次的累加和

 

OPC 服务器开发包 
  http://shop66418560.taobao.com

 

posted @ 2011-05-03 16:51  wangok  阅读(518)  评论(0编辑  收藏  举报