代码之家  ›  专栏  ›  技术社区  ›  kdbdallas

计算连接/下载速度

  •  11
  • kdbdallas  · 技术社区  · 17 年前

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

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

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

    谢谢

    4 回复  |  直到 17 年前
        1
  •  40
  •   Peter Hosey    15 年前

    中堂是 bytes_downloaded / (now - start_time) ,但如果连接速度波动很大,或者用户在下载中途开始另一次下载(可能是在另一个应用程序中),那么这将变得不准确。如果用户在后台运行torrent,这两种情况都可能发生。

    一种更好的方法(尽管更难实现)是保留一组周期性样本并呈现平均值。

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

    每半秒(你可以尝试不同的间隔),测量你下载了多少字节,然后从这个新的总数中减去之前的总数。将差值添加为数组中新的最后一个元素。如果这会使数组增长到一定大小以上,请剪掉第一个元素(最旧的样本)。然后,显示所有样本的平均值。

    你应该保留大约25秒的样本,间隔应该在0.5到1秒之间(这是货币和性能之间的权衡)。

    如果第一个元素为零,您可能还希望在检索后将其从数组中删除。这使你的起始报道更加准确,并帮助你更快地从停滞中恢复过来,因为你在平均值中没有包括旧的零。

        2
  •  20
  •   Mick MacCallum    11 年前

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

    transfer_speed = bytes_transferred / ( current_time - start_time)
    

    您可能希望使用秒或毫秒的精度来计算时间,当然,如果您想要比特/秒,可以将结果乘以8。

    由于您使用的是Cocoa,因此可以使用NSDate类来获取时间戳。例如,在开始传输时使用以下命令:

    NSTimeInterval start = [NSDate timeIntervalSinceReferenceDate];
    

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

    double speed = bytesTransferred / ([NSDate timeIntervalSinceReferenceDate] - start);
    
        3
  •  1
  •   Chirantan    17 年前

    你需要知道

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

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

      如果你知道从一开始发送的字节数,这很容易做到。(从头发送的新字节-1秒前从头发送的字节)

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

      (传输的字节数/总字节数)

        4
  •  0
  •   Piskvor left the building Rohit Kumar    17 年前

    记录转账所需的时间。传输速率只是传输的字节数/经过的秒数,换句话说,就是每秒字节数。你不需要这个的总尺寸。(您还可以显示已完成百分比,即传输的字节数/总字节数*100)