下载速度到处跳跃

Download speed jumping around allover

本文关键字:跳跃 下载速度      更新时间:2023-10-16

我有一个使用curl从ftp下载文件的小程序。在CURLOPT_PROGRESSFUNCTION中传递的函数中,我进行计算以了解下载速度,问题是下载速度到处跳跃,在2mbps的互联网连接上从512kbps到8mbps。我不知道这里出了什么问题。

编辑:我已经改变了代码平均读数,旋度下载的问题是你不能预测当TraceProgress函数将被调用时,它又可以被称为在小于1秒,所以程序等待5迭代记下读数,并采取6这样的平均读数前,我还认为时间(秒)运行自去年读了,因为我们不能保证TraceProgress函数将被称为每隔相等。

如果现在看起来好点了,请告诉我。

代码如下:

int minorCounter = 0;
int majorCounter = 0;
int minorCycle = 4;
int majorCycle = 5;
double blockDL[6];
double blockTime[6];
int TraceProgress( void *clientp, double dltotal, double dlnow, double ultotal, double ulnow )
{
  if ( minorCounter == minorCycle )
    {
            blockDL[majorCounter] = dlnow - oldDownloadNow;
            myTimer.Tick();
            blockTime[majorCounter] = myTimer.GetDurationInSecs();
            minorCounter = 0;

            if ( majorCounter == majorCycle )
            {
                double dl = 0;
                double tm = 0;
                for ( int i = 0; i < majorCycle ; i++ )
                {
                    dl += blockDL[i];
                    tm += blockTime[i];
                }
                dl = dl/(majorCycle+1);
                tm = tm/(majorCycle+1);
                double currentDownloadSpeed = dl / tm;
                /* download speed - divide by 1024 to get speed in kilobytes instead of bytes */
                double idownloadSpeed = currentDownloadSpeed / 1024;
                string post;
                if ( idownloadSpeed > 1024 )
                {
                       idownloadSpeed = idownloadSpeed / 1024;
                       post = " MB/s";
                }
                else
                {
                        post = " KB/s";
                }
                string downloadSpeed = DoubleToString( idownloadSpeed );
                size_t x = downloadSpeed.find( "." );
                downloadSpeed.erase( x+2 );
                downSize = "Download Speed:  " + downloadSpeed + post;
                SendMessage( hDownloadSpeedSTATIC, WM_SETTEXT, (WPARAM)0, (LPARAM)downSize.c_str() );
                majorCounter = 0;
            }
            else
            {
                majorCounter++;
            }
            oldDownloadNow = dlnow;
            myTimer.Start();
    }
    else
    {
            minorCounter++;
    }
    return 0;
}

你需要使用采样窗口和指数衰减或其他类似的东西。

如果每30分钟就有一辆汽车从装配线上下来,而你只拿一个样品,可怕的事情就会发生。例如,如果你在一辆车下线后进行采样,然后在20分钟后再次采样,你会在20分钟内看到零辆车,即每小时零辆车。如果你在一辆车下线前采样,31分钟后再采样,你会在31分钟内看到两辆车,每小时3.9辆车。

这里有一个简单的算法:

  1. 保持单个计数和单个平均速度。

  2. 每秒更新一次

  3. 每秒先将前一秒接收到的字节数加到计数中

  4. 添加计数后,从计数中减去1/8。count -= (count/8);

  5. 每秒为单位,更新平滑平均速度为当前计数。bits_per_sec = count; .

要了解该算法的工作原理,假设计数是常数。这意味着加到计数上的数量必须等于减去的数量。这意味着该计数必须是每秒添加的字节数的8倍,使其成为每秒接收的比特数。