计算连接/下载速度

我有一个客户端和服务器程序(都在Obj-C),我正在使用这两个程序在两个设备之间传输文件。

转移工作正常,但我想向用户展示他们获得的传输速率。

所以我知道文件的总大小以及文件的传输量,有没有办法从这些信息中计算出传输速率,如果没有,我需要什么信息来计算传输速率?

谢谢

一旦你开始下载,捕获当前的系统时间并将其存储为“开始时间”。 然后,在传输过程中的任何一点计算传输速度所需要做的就是再次查看系统时间,并将其用作“当前时间”来计算到目前为止所花费的总时间:

transfer_speed = bytes_transferred / ( current_time - start_time) 

你可能想用秒或毫秒的时间精度,当然可以乘以8,如果你想要位/秒。

既然你使用Cocoa,你可以使用NSDate类来获得时间戳。 例如,开始传输时使用以下内容:

 NSTimeInterval start = [NSDate timeIntervalSinceReferenceDate]; 

然后使用以下方法定期检查传输速率:

 double speed = bytesTransferred / ([NSDate timeIntervalSinceReferenceDate] - start); 

天真的方式是bytes_downloaded / (now - start_time) ,但是如果连接速度大幅波动,或者用户在下载的一半开始另一次下载(可能在另一个应用程序中),则这变得不准确。 如果用户在后台运行洪stream,这两种情况都可能发生。

一个更好的方法(尽pipe难以实现)是保持一系列周期性样本,并呈现平均值。

从包含0的数组开始。数组是样本,每个样本是自上一个样本以来下载的字节数。 然后开始下载。

每半秒(你可以尝试不同的时间间隔),测量你下载了多less字节,然后从这个新的总数中减去前一个总数。 将差异添加为数组中新的最后一个元素。 如果这个数组增长超过一定的大小,砍掉第一个元素(最旧的样本)。 然后,呈现所有样本的平均值。

您应该保持2-5秒的样本量,间隔应该在0.5到1秒之间(这是货币和性能之间的折中)。

如果数组为零,则可能还需要从数组中删除第一个元素。 这使得你的起始报告更加准确,并且可以帮助你更快地从摊位中恢复过来,因为你的平均值不包括旧的零。

你需要知道

  1. 从一开始发送的字节(计算平均传输率)

  2. 自上一秒以来发送的字节(计算当前传输速度)。

    如果您知道从头开始发送的字节,这可以很容易地完成。 (从头开始发送的新字节 – 从1秒前开始发送的字节)

  3. 文件总大小(计算进度的百分比)

    (字节转移/总字节数)

跟踪转移的时间。 传输速率只是传输字节/秒,即每秒字节数。 你不需要这个总大小。 (你也可以显示%完成,这是字节传输/总字节数* 100)