gpt4 book ai didi

ios - 为什么 swift 函数要编译 25 次?

转载 作者:行者123 更新时间:2023-12-02 08:31:48 25 4
gpt4 key购买 nike

我意识到我的 iOS 项目(相当大,只有 swift 代码)需要很长时间才能构建,因此我开始使用 -debug-time-function-bodies 分析代码构建时间 并检查转录日志。

我注意到我的很多函数都被编译了 25 或 26 次。

什么可能导致此类问题?

为了让这个问题更容易理解,这里有一个来自 BuildTimeAnalyzer for Xcode 的屏幕截图

enter image description here

正如您在occurrences下所看到的,某些函数构建了 25 或 26 次。

最佳答案

您提供的数据不足以说明实际原因,但我将总结一些可能性。

出现的意义是什么?

这意味着编译器正在多次对方法、属性或表达式进行类型检查。

<小时/>

我如何知道该方法是什么、在哪里以及它到底需要多长时间?

通过启用这两个标志,您可以直接在代码中看到它们:

-Xfrontend -warn-long-expression-type-checking=100
-Xfrontend -warn-long-function-bodies=100
<小时/>

标志中的 100 是什么?

这是您意识到的最短时间。您可以从较高的数字开始,并在解决更昂贵的问题后逐步降低它。

<小时/>

我该如何解决这个问题?

通过告诉编译器您已经知道的内容,而不是让它自行推断。例如:

let singleString = myStrings.joined(separator: ";") /* takes around 200ms to compile */
let singleTypedString: String = myStrings.joined(separator: ";") /* Takes just 1ms to compile */

如您所见,写入String类型将消除199 ms(此时)

你可以找到一个更复杂的例子here in this answer代码中的简单更改可节省大约 2700 毫秒!

<小时/>

为什么编译器一遍又一遍地这样做?

似乎较新的 Xcode 版本中的一些更改(我认为其中之一是并行构建等)导致了这一点。 LLDB 和 Swift 语言开发人员正在努力提高性能,但我们可以自己帮助我们。

是否有任何解决方法可以防止多重类型检查?

根据问题的来源(变量、函数、闭包、惰性等),有一些方法可以增强它。例如:

将所有内容都设为最终,并且比这更好,尽可能将它们设置为私有(private)。这就是编译器知道您不会覆盖它的方式,因此它只需进行一次类型检查。

这样可以减少构建时间并防止编译器多次进行类型检查。

希望有帮助。

<小时/><小时/>

还有一件事!:

根据this link in Swift.org :

-Xfrontend, which prompted this post. Every front-end argument is considered unstable. All of them. Even the ones that are the same as driver options. I'd really like to rename this but I don't know what to rename it too. (And to make matters worse, Xcode currently uses it for something. You don't want to know.)

因此,第一,确保您仅在 Debug模式下使用这些标志,第二,修复您要查找的问题后将其关闭,并时不时地尝试它们。

关于ios - 为什么 swift 函数要编译 25 次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59270100/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com