【问题标题】:Calculating Connection/Download Speed计算连接/下载速度
【发布时间】:2010-09-27 02:31:17
【问题描述】:

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

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

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

谢谢

【问题讨论】:

标签: objective-c cocoa


【解决方案1】:

最简单的方法是bytes_downloaded / (now - start_time),但如果连接速度波动很大,或者用户在下载过程中开始另一次下载(可能在另一个应用程序中),这将变得不准确。如果用户在后台运行种子文件,这两种情况都可能发生。

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

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

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

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

如果数组中的第一个元素为零,您可能还希望在检索到它之后从该数组中删除它。这使您的开始报道更准确,并帮助您更快地从失速中恢复过来,因为您的平均值不包括旧零。

【讨论】:

  • 很好的答案,我一直想知道最好的方法是什么。
  • 嘿 - 我怎样才能得到这个以 Mbps 为单位的值?
  • 使用 RFC 中建议的公式怎么样? SRTT <- (1 - alpha) * SRTT + alpha * R' 其中SRTT 是平滑的RTT,R` 是最新的RTT,推荐alpha1/8。如果您担心偏差,也有一个公式。 (虽然我不确定这是否值得..)
【解决方案2】:

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

transfer_speed = bytes_transferred / ( current_time - start_time)

您可能希望对时间使用秒或毫秒精度,如果您需要位/秒,当然可以将结果乘以 8。

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

NSTimeInterval start = [NSDate timeIntervalSinceReferenceDate];

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

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

【讨论】:

  • Poitner * 不应与 NSTimerInterval 一起使用。请更正
  • 嗨,马克。我想知道我们如何将该速度转换为 Kbps 或 mbps。
  • 嘿 - 我怎样才能得到这个以 Mbps 为单位的值?
【解决方案3】:

你需要知道

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

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

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

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

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

【讨论】:

    【解决方案4】:

    跟踪传输所用的时间。传输速率只是传输的字节数/经过的秒数,即每秒字节数。您不需要总大小。 (也可以显示完成百分比,即传输的字节数/总字节数*100)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-16
      • 2015-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-02
      • 2012-05-17
      • 2019-12-29
      相关资源
      最近更新 更多