下载速度到处跳跃
Download speed jumping around allover
我有一个使用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/8。
count -= (count/8);
-
以位每秒为单位,更新平滑平均速度为当前计数。
bits_per_sec = count;
.
要了解该算法的工作原理,假设计数是常数。这意味着加到计数上的数量必须等于减去的数量。这意味着该计数必须是每秒添加的字节数的8倍,使其成为每秒接收的比特数。
相关文章:
- 为什么在读取文件大小时文件IO速度会发生变化
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- 文件系统:复制功能的速度秘诀是什么
- 下载URL中的所有文件
- 学习多线程C++:添加线程不会使执行速度更快,即使它看起来应该
- 在C++中使用并行化的预期速度是多少(不是 OpenMp,而是 <thread>)
- 两个连续的 OpenMP 并行区域会相互减慢速度
- VisualStudio:使用 Suse Enterprise Server 12 SP5 时,不会下载远程库标头
- 从 C++ 上的网址下载文件
- 查找标准::hash_map与标准::矢量的速度
- 加快在C++中读取/处理日志文件的速度
- 为什么这些算法的运行速度比它们应该的要快?
- libcurl :显示正在运行的上传和下载速率
- LIBCURL:网络上传下载速度的输出不准确
- libcurl下载速度太慢
- Qt5:如何修改下载速度以显示 1.xx MB/s 而不是 1.xxxxx MB/s
- 在 libcurl 中计算下载速度
- 抑制下载速度的变化
- C libcurl,限制下载速度-cpu使用率达到100%
- 下载速度到处跳跃