相同的操作在两个相同的项目中执行时间不同

The same operation takes different execution times in two identical projects

我有一个正在尝试迁移到新项目的应用程序。我在 主线程异步处理 中有一个繁重的操作。在我的旧项目中,完成此任务只需要 1 秒,但在我的新项目中,完成相同任务需要 6-7 秒 .

我观察了 CPU 的使用情况,看起来新应用程序使用的 CPU 更少并且获得的线程很少,而旧应用程序获得了很多线程来完成相同的任务。 PS: 我用的是同一台设备

这可能是什么原因造成的?有什么想法或建议吗?
谢谢。

终于找到问题了。这是由 Xcode Build Settings 中的 Optimization Level 设置引起的。创建新项目时,默认Debug优化级别为noneRelease优化级别为Fastest, Smallest [-Os] 所以当我将Debug更改为Fastest, Smallest [-Os]时,我的任务完成时间下降到 1 秒。

来自苹果:

The Xcode compiler supports optimization options that let you choose whether you prefer a smaller binary size, faster code, or faster build times. For new projects, Xcode automatically disables optimizations for the debug build configuration and selects the Fastest, Smallest option for the release build configuration. Code optimizations of any kind result in slower build times because of the extra work involved in the optimization process. If your code is changing, as it does during the development cycle, you do not want optimizations enabled. As you near the end of your development cycle, though, the release build configuration can give you an indication of the size of your finished product, so the Fastest, Smallest option is appropriate.

如果您想了解有关优化级别和性能的更多信息:Tuning for Performance and Responsiveness

旁注:在调试模式下将优化级别更改为最快、最小 [-0s] 可能会影响调试器断点并且它会突然运行。

干杯。

这可能不是对你问题的真正回答,你自己回答得很好,但我仍然觉得有必要。

我想强调一下你不应该在主线程上进行长时间的 运行 操作。没原因。实际上,如果您希望屏幕每秒刷新 60 次(这应该始终是您的目标),这意味着您提交给主线程的每个代码块必须持续少于 0.016 秒(1/60)以避免丢失一些帧.如果在此期间,您还需要让主线程执行一些复杂的动画和其他操作,那么您可能需要远远落后于 0.016 秒点。

如果您阻塞主线程的时间超过该时间(在本例中为 1 秒),用户将体验到界面卡住,他们无法滚动 scrollView 或导航应用程序。他们可能会完全关闭您的应用程序,因为他们可能会觉得它卡住了。

例如,在您的情况下,您可能想要添加一些漂亮的加载动画,例如 ActivityIndi​​cator 或一些更好的动画,以表达您当时确实在工作并且没有卡住。这确实是当今用户所期望的。 如果用户想要取消长 运行 操作并使用您的应用程序执行其他操作,您可能(或可能不会,这取决于您)还想添加一个取消按钮。

为避免您所说的导致性能损失(任务减慢 7-8 秒),您可能需要使用高 quality of service 的 serialQueue。 可能 userInitiated 就是你想要的。

这样您仍然可以让 OS 优先处理那些任务,但您不会同时阻塞主线程,例如允许您添加加载动画。

如果性能仍然太低,您可以考虑将任务拆分为子任务并使用 DispatchQueue.concurrentPerform(iterations:execute:) 让它们并行执行(但我不知道这对您的情况是否可行) .

希望对您有所帮助。 干杯