cop*_*ing 5 compilation ios swift
我有一个Swift SpriteKit项目,包含大约25个小文件.编译这个项目的时间是30-45秒!它是纯粹的Swift,没有ObjC.
我在Report Navigator中观察了编译,试图找到一个花时间的文件.但是,它不是一个单独的文件.它始终是列表中的最后一个文件,似乎总是占用.但是这个文件在编译之间可能会有所不同,但仍然需要花费很多时间.
在最后一个文件之后的步骤是Merge xxx.swiftmodule,这很快就会发生,但是我不确定是否因为它在它可能相关的缓慢之后出现.
我搜索并尝试了各种方法来找到罪魁祸首.我看了这篇文章:为什么Swift编译时间这么慢?并尝试了这些方法.我使用CTRL-来完成了命令行构建,但是没有显示有关缓慢的任何有用信息.
我已经完成了我的项目,寻找类型推断可能会被绊倒的地方,但是没有找到太多(实际上,如果是这种情况,我希望单个文件成为罪魁祸首).
有没有人有任何其他建议来追踪这个?来自几乎立即编译的Objective-C项目,这让我发疯.
编辑我对此进行了更多的工作,包括构建输出的屏幕截图,注意到缓慢发生的位置.问题是,如果我在缓慢的文件中注释掉的代码,那么该文件之前,在列表中就变成了一个缓慢的(它被罚款之前).如果我将该代码注释掉,那么那之前的代码就会变慢,等等.

经过更多的挖掘和调试,我发现了问题.事实证明它实际上是类型推断,正如其他帖子所暗示的那样.问题的一部分是我没有注意到报告导航器中的构建输出显示了仍在编译的文件的箭头,以及已完成的文本的复选标记(我的色盲起了作用).所以当我没有完成编译时,我认为他们都已完成编译.
在任何情况下,我都在这里阅读文章:通用汽车发布的Xcode 6编译并完成了整个项目的命令行构建,它向我展示了问题的文件.然后,使用上面提到的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))
Run Code Online (Sandbox Code Playgroud)
我知道它似乎一团糟 - 我在早期玩弄了许多不同的选项,但还没有回过头来简化.我用它替换了它(当然会替换文字以及更简单):
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)
Run Code Online (Sandbox Code Playgroud)
现在编译速度非常快!
我不确定这里是否有任何新的信息,但是想要通过一个解决方案关闭它,万一有人遇到它.
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
Run Code Online (Sandbox Code Playgroud)
很棒的 Brian Irace 写了一篇关于它的精彩文章《分析你的 Swift 编译时间》。
| 归档时间: |
|
| 查看次数: |
1926 次 |
| 最近记录: |