我有一个客户端和服务器程序(都在Obj-C中),我正在使用这些程序在两个设备之间传输文件.
传输工作正常,但我想向用户显示他们获得的传输速率.
所以我知道文件的总大小,以及传输了多少文件,有没有办法从这些信息中找出传输速率,如果没有,我需要哪些信息来计算传输速率?
谢谢
天真的方式是bytes_downloaded / (now - start_time)
,但如果连接速度剧烈波动,或者如果用户在下载途中开始另一次下载(可能在另一个应用程序中),则会变得不准确.如果用户在后台运行torrent,则可能发生这两种情况.
更好的方法(虽然更难实现)是保留一组周期性样本并呈现平均值.
从包含0的数组开始.数组是样本,每个样本是自上一个样本以来下载的字节数.然后开始下载.
每半秒(您可以尝试不同的间隔),测量您下载的字节数,然后从新的总数中减去之前的总数.将差异添加为数组中的新最后一个元素.如果这使数组增长超过一定大小,则删掉第一个元素(最旧的样本).然后,显示所有样本的平均值.
您应该保留2-5秒的样本,并且间隔应该在0.5到1秒之间(这是货币和性能之间的权衡).
如果它是零,您可能还希望在检索后从数组中删除第一个元素.这使得您的起始报告文件更加准确,并帮助您从摊位中更快地恢复,因为您不会在平均值中包含旧的零.
一旦开始下载,捕获当前系统时间并将其存储为"开始时间".然后,在传输过程中任何时候计算传输速度所需要做的就是再次查看系统时间并将其用作"当前时间"来计算到目前为止所花费的总时间:
transfer_speed = bytes_transferred / ( current_time - start_time)
您可能希望在时间上使用秒或毫秒精度,当然如果您想要比特/秒,则可以将结果乘以8.
由于您使用的是Cocoa,因此可以使用NSDate类来获取时间戳.例如,在开始传输时使用以下内容:
NSTimeInterval start = [NSDate timeIntervalSinceReferenceDate];
然后使用以下方法定期检查传输速率:
double speed = bytesTransferred / ([NSDate timeIntervalSinceReferenceDate] - start);