【问题标题】:Calculating network speed in iOS. Round trip time with less data won't inform about exact network speed在 iOS 中计算网络速度。数据较少的往返时间不会告知确切的网络速度
【发布时间】:2023-03-07 13:28:01
【问题描述】:

我正在尝试在我的应用中计算网络速度,因此我只能上传在这种网络条件下可以上传的数据量。为此,我的计划是:

  1. 我的应用程序的默认速度可能是 (500KB/s)。
  2. 我的应用将发送包含 500kb 数据的请求。
  3. 它将监控系统上传数据并获得响应所花费的往返时间。例如,应用在 5 秒内收到 200kb 数据,速度将是 (500+200)/5。
  4. 根据上面的例子,我的带宽是 140KB/s 的请求。
  5. 我将根据我的带宽计算指数移动平均值。
  6. 我将根据计算出的平均带宽发送下一个请求。

这是我对 NSURLSession 的实现:

//Initializing NSURLSession [one time only]
let configuration = NSURLSessionConfiguration.backgroundSessionConfigurationWithIdentifier("com.test.ios.background")
self.backgroundSession = NSURLSession(configuration: configuration, delegate: self, delegateQueue: nil)

// Create session task: 
var urlSessionTask = self.backgroundSession.uploadTaskWithRequest(request, fromFile: NSURL.fileURLWithPath(filePath!)) urlSessionTask.resume() 
let requestStartTime = NSDate().timeIntervalSinceReferenceDate

//On didCompleteWithError calculating speed.
func URLSession(session: NSURLSession, task: NSURLSessionTask, didCompleteWithError error: NSError?) {
    let downloadEndTime = NSDate().timeIntervalSinceReferenceDate
    let networkSpeed = Int(Double(sessionTask.receivedData.length + task.countOfBytesSent) / (downloadEndTime - requestStartTime))
}

如果我失去带宽,我可以使用这种方法找到它,因为我的平均带宽下降,但问题是一旦我达到低带宽并且我的网络条件得到改善,我的带宽将不会得到改善,因为我保持在请求中发送较少的数据,它会一直说带宽低。

如果我的网络状况有所改善,我可以发送更多数据吗?

我想到的一个解决方案是,我可以在每 10 个请求中发送最大数据(可能是 500KB),这样我就可以在网络条件得到改善的情况下获得更高的带宽。

【问题讨论】:

  • 您如何上传数据。你在使用 nsurlsession 吗?你能写一些代码来理解击球手吗?
  • @CrazyDeveloper 我已经添加了相同的代码。是的,我正在使用NSURLSession

标签: ios swift nsurlsession nsurlsessiontask


【解决方案1】:

为了获取请求开始和结束时间等指标,我建议在您的 URLSession 上实现以下委托方法

@available(iOS 10.0, *)
optional public func urlSession(_ session: URLSession, task: URLSessionTask, didFinishCollecting metrics: URLSessionTaskMetrics)

URLSessionTaskMetrics 包含一个属性taskInterval,它将为您提供往返时间。

至于动态修改你发送的数据量,我不明白这种方法。不管你的请求体有多大,你的应用都会受到网络带宽的限制;这是你无法控制的。您可以尝试利用新的URLSessionConfiguration 属性来最大化网络带宽:

@available(iOS 11.0, *)
open var multipathServiceType: URLSessionConfiguration.MultipathServiceType

我建议保留请求 body 原样,让操作系统处理优化网络连接不良的更精细细节。

【讨论】:

  • 只是指出 taskInterval 是从任务创建到完成的时间量。不是转移需要多长时间。在我的情况下,我正在做:如果让 firstTransactionStartDate = metrics.transactionMetrics.first?.fetchStartDate,让 lastTransactionEndDate = metrics.transactionMetrics.last?.responseEndDate { duration = responseEndDate.timeIntervalSince(firstTransactionStartDate) } 得到真正的持续时间
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-30
  • 1970-01-01
  • 1970-01-01
  • 2014-06-08
  • 2016-05-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多