首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在两个相同的项目中,相同的操作需要不同的执行时间。

在两个相同的项目中,相同的操作需要不同的执行时间。
EN

Stack Overflow用户
提问于 2020-04-04 16:34:22
回答 2查看 274关注 0票数 3

我有一个应用程序,我试图迁移到一个新的项目。有一个繁重的操作,我正在处理的主线程异步。在我以前的项目中,只需要第二个就可以完成这个任务,但是在我的新项目中,相同的任务需要6-7秒

我观察到了CPU的使用情况,看起来新的应用程序使用的CPU较少,线程很少,而旧的应用程序为相同的任务获得了大量的线程。PS:我用的是同样的设备。

是什么导致的?有什么想法或建议可以找出来吗?

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-04-09 15:07:20

最后,我发现了这个问题。这是由Xcode Build Settings中的Build Settings设置引起的。创建新项目时,默认的Debug优化级别为none,而Release优化级别为Fastest, Smallest [-Os],因此当我将Debug更改为Fastest, Smallest [-Os]时,任务完成时间降至1秒。

来自苹果:

Xcode编译器支持优化选项,这些选项允许您选择更小的二进制大小、更快的代码还是更快的构建时间。对于新项目,Xcode自动禁用调试生成配置的优化,并为发布版本配置选择最快、最小的选项。任何类型的代码优化都会导致较慢的构建时间,因为优化过程需要额外的工作。如果您的代码正在更改,就像在开发周期中所做的那样,您不希望启用优化。但是,随着开发周期接近尾声,版本构建配置可以给出成品大小的指示,所以最快、最小的选项是合适的。

如果您想了解更多关于优化级别和性能的内容:性能和响应性的调优

附带注意:在调试模式下,将优化级别更改为最快的、最小的0-0可能会影响调试器断点,并且会突然发生行为。

干杯。

票数 3
EN

Stack Overflow用户

发布于 2020-04-11 18:30:19

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

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

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

例如,在您的示例中,您可能希望添加一些很好的加载动画,比如ActivityIndicator或一些更好的动画,以表示您实际上正在工作,而且没有冻结。这是当今用户所期望的。如果用户想要取消长时间运行的操作,并对应用程序进行其他操作,您也可以(或者不需要,由您自己决定)添加一个cancel按钮。

为了避免您说的话会导致性能的损失(任务慢到7-8秒),您可能需要使用一个具有高serialQueue的服务质量。也许userInitiated就是你想要的。

这样,操作系统仍然可以对这些任务进行优先级排序,但是在此期间不会阻塞主线程,例如允许添加加载动画。

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

希望这能帮到你。干杯

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61031271

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档