快速操作队列开始下一个操作的时间[关闭]

问题描述 投票:0回答:2

我有一组异步运行且具有相互依赖性的任务。现在,所有这些都通过自定义代码进行管理,我想改用OperationQueue。但是,计时性能非常关键。

使用当前的实现,当一个任务完成时,它立即调用所需的代码以启动下一个任务。因此,所涉及的时间只是调用一个函数。现有任务相当少,有些任务是异步的,有些是单个函数的调用。

从一个操作完成到下一个操作开始需要多少时间?

swift nsoperationqueue
2个回答
0
投票

[当您有这样的问题时,您可能只想衡量一下。路标和兴趣点(使用“工具”对应用程序进行“配置”)是衡量性能的一种好方法。因此:

import os.signpost

let pointsOfInterest = OSLog(subsystem: "Operations", category: .pointsOfInterest)

和:

let queue = OperationQueue()
queue.maxConcurrentOperationCount = 1

var id = OSSignpostID(log: pointsOfInterest)
queue.addOperation {
    os_signpost(.begin, log: pointsOfInterest, name: "Operation", signpostID: id)
}
for _ in 0 ..< 100 {
    queue.addOperation {
        os_signpost(.end, log: pointsOfInterest, name: "Operation", signpostID: id)
        id = OSSignpostID(log: pointsOfInterest)
        os_signpost(.begin, log: pointsOfInterest, name: "Operation", signpostID: id)
    }
}
queue.addOperation {
    os_signpost(.end, log: pointsOfInterest, name: "Operation", signpostID: id)
}

我个人确保在进行这些测试之前让应用程序达到静止状态,通常只需将例程延迟几秒钟,这样可以减少标准应用程序的启动开销,否则可能会改变结果。我还会对基准测试进行多次迭代,以获取更具代表性的结果。

使用Instruments的Points of Interest工具进行分析可以获取这组结果并为我们进行总结。例如,在我的MacBook Pro上运行的iOS模拟器上,它报告:

Min:31.69 µs平均:74.70 µs标准差:24.05 µs最大值:154.10 µs

在我的iPhone XS Max上:

Min:44.92 µs平均:125.78 µs标准差:43.61 µs最大值:446.88 µs

您的行驶里程可能会有所不同,但以大致的数量级说明了所需的间接费用。最重要的是,对于大多数用例而言,开销可以忽略不计。

如果您要测试其他场景,请放心。希望这可以说明您如何使用Instruments中的Point of Interest工具来衡量性能。有关更多信息,请参见Getting Started with Instruments


0
投票

从一项操作完成到完成下一个操作开始吗?

下一个操作几乎立即开始。这段时间很小,您可以忽略它。

还有其他使用操作队列的消息吗?

OperationQueue是非常有效的解决方案。

您可以通过设置属性来控制性能:

如果操作彼此依赖,请记住为它们设置这种关系

© www.soinside.com 2019 - 2024. All rights reserved.