gpt4 book ai didi

swift - 如何测量 Swift 中 DispatchQueue 并发异步中的代码块执行时间?

转载 作者:行者123 更新时间:2023-11-28 05:40:18 26 4
gpt4 key购买 nike

假设我有这种功能和 DispatchQueue 逻辑。假设当 synchLatest() 被调用时,它会触发 "Code Block 1" 两次。

在一个循环中,"Code Block 1" 的执行应该是怎样的,它只是从 grpc 响应中检索一个字符串并存储在 UserDefaults 中带我 1.7 秒 第二次在循环中执行需要 5 秒?

let synchQueue = DispatchQueue(label: "com.dmapp.synchQueue", qos: .default, attributes: .concurrent)

let synchProcessQueue = DispatchQueue(label: "com.dmapp.processQueue", qos: .default, attributes: .concurrent)

func synchLatest() {
while(someconditions) {
synchQueue.async {
...
let response = try grpcCall.receive()
...
synchProcessQueue.async {
....
measure("Code Block 1", {
if response.data.nickname != "" {
// Store in UserDefaults
}
})
....
}
}
}
}

@discardableResult
static func measure<A>(name: String = "", _ block: () -> A) -> A {
let startTime = CACurrentMediaTime()
let result = block()
let timeElapsed = CACurrentMediaTime() - startTime
print("Time: \(name) - \(timeElapsed)")
return result
}

我在这里测量代码执行时间的方式是否错误?

最佳答案

CACurrentMediaTime 是测量时间的好方法。它的开销很低,不会遇到 DateCFAbsoluteTimeGetCurrent 的问题,这“不保证单调递增的结果。”

基准测试的一些一般准则包括:

  • 让应用在开始基准测试之前达到静止状态;
  • 不要同时运行相互独立的测试(因为它们可能会争用相同的资源);
  • 重复多次;和
  • 更改执行基准测试的顺序,以消除测量中的噪音。

如果您正在寻找手动使用 CACurrentMediaTime 的替代方法,另一种方法是使用 signposts and points of interest ,它不仅会捕获所需的时间量,而且会让您将仪器时间线过滤到相关时间段(并且您可能能够诊断出差异的来源)。

关于swift - 如何测量 Swift 中 DispatchQueue 并发异步中的代码块执行时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57003625/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com