假設我有一個提供一些長時間操作的函式。
func foo(parameter: String)
這個函式是同步的,我不能改變它。
我需要在引數陣列上運行函式:
stringArray.forEach { foo($0) }
顯然這需要時間。
我更喜歡制作一個異步函式來使其異步,如下所示:
func manyFoo(parameters: [String]) async {
await withTaskGroup(of: Void.self) { group in
for parameter in parameters {
group.addTask { foo(parameter: parameters) }
}
}
}
但它真的foo同時執行嗎?
uj5u.com熱心網友回復:
你問:
但它真的
foo同時執行嗎?
是的,它確實。
注意,如果你在模擬器上運行,并發程度受到很大限制,所以一定要在物理設備上運行。但我添加了一些os_signpost日志記錄,對其進行了分析,并在 Instruments 的“興趣點”和“Swift 任務”工具中觀察了它:

您可以在我的 iPhone 12 Pro Max 上看到,我有六個并發任務。
那是:
import os.log
private let log = OSLog(subsystem: "Test", category: .pointsOfInterest)
func foo(parameter: String) {
let id = OSSignpostID(log: log)
os_signpost(.begin, log: log, name: #function, signpostID: id, "%@: OK")
...
os_signpost(.end, log: log, name: #function, signpostID: id)
}
請注意,要查看性能的任何實質性改進,您需要確保每個任務有足夠的作業來證明并發引入的適度開銷是合理的。例如,如果你有一百萬個字串,每個字串需要 20 毫秒,它實際上可能會更慢。因此,您可能需要進行“跨步”(例如,100 個任務,每個任務處理 10,000 個字串)。
或者,如果您的任務都與某些共享資源(如檔案)互動,您可能根本無法實作任何性能改進。
在不知道您的同步任務在做什么的情況下,我們無法進一步評論。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/518207.html
標籤:迅速异步异步等待
