如何调试缓慢的Swift编译时间

时间:2015-07-14 18:29:54

标签: ios swift compilation

我有一个包含大约25个小文件的Swift SpriteKit项目。编译这个项目的时间是30-45秒!它是纯粹的Swift,没有ObjC。

我已经在报告导航器中观察了编译,试图找到一个花时间的单个文件。但是,它并不是一个单一的文件。它始终是列表中的 last 文件,似乎一直都在使用。但是这个文件在编译之间可能会有所不同,但仍然需要花费很多时间。

在最后一个文件之后的步骤是Merge xxx.swiftmodule,这很快就会发生,但我不确定是否因为它可能在它可能相关的缓慢之后出现。

我已经搜索并尝试了各种方法来找到罪魁祸首。我读了这篇文章:Why is Swift compile time so slow?并尝试了这些方法。我使用CTRL-来完成命令行构建,但是没有显示有关缓慢的任何有用信息。

我已经完成了我的项目,寻找类型推断可能会被绊倒的地方,但是找不到多少(实际上,如果是这样的话,我会期待一个文件是罪魁祸首)。

有没有人有任何其他建议来追踪这个?来自几乎立即编译的Objective-C项目,这让我发疯。

EDIT 我对此工作了一点,并且包括构建输出的屏幕截图,注意到缓慢发生的位置。问题是,如果我在缓慢的文件中注释掉代码,那么列表中之前的文件就会变得很慢(之前很好)。如果我将该代码注释掉,那么之前的那个就会变得慢一些,等等。

Build Output

3 个答案:

答案 0 :(得分:5)

经过多次挖掘和调试后,我发现了问题。事实证明它实际上类型推断,正如其他帖子所建议的那样。问题的一部分是我没有注意到报告导航器中的构建输出显示了仍在编译的文件的箭头,以及已完成的文本的复选标记(我的色盲起了作用)。所以当我没有完成编译时,我认为他们都已完成编译。

无论如何,我在这里阅读了这篇文章:GM release of Xcode 6 compile并完成了整个项目的命令行构建,它向我展示了问题所在的文件。然后,使用上面提到的CTRL- \方法,我找到了罪魁祸首。

事实证明,这一行是问题所在:

ourWindowCopy.position = CGPoint(x: ((26.5 + theXOffset) * self.multiplierWidth) + (4.0 * CGFloat(randomRow) * 2.0 * self.multiplierWidth), y: ((41.0 + theYOffset) * self.multiplierHeight) + (5.75 * CGFloat(randomColumn) * 2.0 * self.multiplierHeight))

我知道这看起来一团糟 - 我在早期玩弄了许多不同的选项而且还没有回过头来简化。我用它替换了它(当然会替换文字以及更简单地):

let floatRandomRow = CGFloat(randomRow)
let floatRandomCol = CGFloat(randomColumn)
let pointX: CGFloat = ((26.5 + theXOffset) * self.multiplierWidth) + (4.0 * floatRandomRow * 2.0 * self.multiplierWidth)
let pointY: CGFloat = ((41.0 + theYOffset) * self.multiplierHeight) + (5.75 * floatRandomCol * 2.0 * self.multiplierHeight)

ourWindowCopy.position = CGPoint(x: pointX, y: pointY)

现在编译速度非常快!

我不确定这里是否有任何新信息,但是想要通过解决方案关闭它,万一有人碰到它。

答案 1 :(得分:4)

Swift编译器中有一个隐藏选项,它打印出编译器编译每个函数所需的确切时间间隔:-Xfrontend -debug-time-function-bodies

在终端中简单运行以下内容并分析结果:

xcodebuild -workspace App.xcworkspace -scheme App clean build OTHER_SWIFT_FLAGS="-Xfrontend -debug-time-function-bodies" | grep [1-9].[0-9]ms | sort -nr > culprits.txt

很棒的Brian Irace写了一篇关于它的精彩文章Profiling your Swift compilation times

答案 2 :(得分:2)

在其他答案的基础上,以下命令很有用......

按构建时间查看已排序的函数列表:

xcodebuild -workspace [Your Workspace Name].xcworkspace -scheme [Your Build Scheme Name] clean build OTHER_SWIFT_FLAGS="-Xfrontend -debug-time-function-bodies" | grep .[0-9]ms | grep -v ^0.[0-9]ms | sort -nr > culprits.txt

要查看需要超过1秒构建的已排序函数列表:

xcodebuild -workspace [Your Workspace Name].xcworkspace -scheme [Your Build Scheme Name] clean build OTHER_SWIFT_FLAGS="-Xfrontend -debug-time-function-bodies" | grep [1-9].[0-9]ms | sort -nr > culprits.txt

你可以得到一个像这样的方案名称列表(这个命令首先运行一个干净的):

xcodebuild -workspace [Your Workspace Name].xcworkspace -list

关于为什么您的构建时间可能很长的有用文章: