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