一段老外写的Swift并发代码,在Playground中运行:
let sentence = "Ray’s courses are the best!"
let wordOperation = BlockOperation()
for word in sentence.split(separator: " ") {
wordOperation.addExecutionBlock {
print(word)
sleep(2)
}
}
duration {
wordOperation.start()
}
最后的duration方法会返回其中block的耗时。
duration代码如下:
public func duration(_ block: () -> ()) -> TimeInterval {
let startTime = Date()
block()
return Date().timeIntervalSince(startTime)
}
作者给出的耗时应该是2s左右,但在我的Mac运行结果是4s左右…
做一下背景科普:
这里使用了Operation类型的一种:BlockOperation,你可以将其看做它是一个直接可以执行block的类,所以你无需在继承的Operation的子类里做文章,省事不少。
BlockOperation默认会在全局队列里并发运行,所以仔细看上面的代码,貌似应该像作者说的那样,耗时是2s左右…
那么是肿么回事呢?来猜猜看…
答案很简单:和你的设备有关!!!!!
它与你的CPU频率快慢没有太大关系(的确也有关,但这里可以忽略之…),但和CPU内核数有直接关系!
我的MacBook Air是4核,而上面会并发处理5个单词,所以第5个单词必须等待,所以会多出个2s来!
而作者的Mac处理器核心数一定大于4,我猜应该至少是8核,所以他只要2s就全部搞定了。
That‘s All!
你猜对了吗?