我们有一个混合的 Obj-C/Swift 项目。 Swift 编译需要非常长的时间。
我使用以下内容构建项目并收集功能时序。
xcodebuild -workspace Pay.xcworkspace -scheme 支付干净构建 OTHER_SWIFT_FLAGS="-Xfrontend -debug-time-function-bodies"| grep .[0-9]ms > build.log
如果我随后使用 sort -nr
对这个文件进行排序,我会得到一个函数构建时间从高到低排序的文件。
例如,使用 Xcode 8.3.2 并给出以下函数:
func scrollViewDidScroll(_ scrollView: UIScrollView) {
let scrollDiff = scrollView.contentOffset.y - self.previousScrollOffset
let absoluteTop: CGFloat = 0;
let absoluteBottom: CGFloat = scrollView.contentSize.height - scrollView.frame.size.height;
let isScrollingUp = scrollDiff > 0 && scrollView.contentOffset.y > absoluteTop
let isScrollingDown = scrollDiff < 0 && scrollView.contentOffset.y < absoluteBottom
if !successView.isHidden && canAnimateHeader(scrollView) {
// Calculate new top constraint
var newTopConstraint = self.headerTopConstraint.constant
if isScrollingDown && scrollView.scrolledToTop {
newTopConstraint = -(max(self.minHeaderHeight, abs(self.headerTopConstraint.constant) - abs(scrollDiff)))
} else if isScrollingUp {
newTopConstraint = -(min(self.maxHeaderHeight, abs(self.headerTopConstraint.constant) + abs(scrollDiff)))
}
// Header needs to animate
if abs(newTopConstraint) != abs(self.headerTopConstraint.constant) {
self.headerTopConstraint.constant = newTopConstraint
self.updateHeader()
self.setScrollPosition(self.previousScrollOffset)
}
self.previousScrollOffset = scrollView.contentOffset.y
}
}
编译时间为 560 毫秒。
认为这可能是类型推断问题,我声明了 scrollDiff (CGFloat) 和 isScrollingUp/isScrollingDown (Bool) 的类型。
这将编译时间减少到 485 毫秒。
我想不出还有什么可能导致编译时间过长。我们有许多函数的运行时间都在 1 毫秒以上,其中一些明显高于上面的示例。
我将不胜感激任何人可能提出的建议。
最佳答案
我知道现在这并不能带来多大的安慰,但是当您可以升级到 Xcode 9 时,您可能会看到开箱即用的改进。我这样说的原因是,由于我的 RetinaBook 目前正在商店更换电池,我正在一个古老的 2008 MBP 上测试它,它甚至不能运行这个软件(我不得不应用 hack 来安装 Sierra),即使使用这种老旧的胶带硬件,Xcode 9 也仅需 181.73 毫秒即可编译您的示例。
话虽如此,我能够通过分离 abs() 调用将其降低到 87.93 毫秒,就像这样,所以您可能想尝试一下,看看它是否同样将您的编译时间减半。
func scrollViewDidScroll(_ scrollView: UIScrollView) {
let scrollDiff = scrollView.contentOffset.y - self.previousScrollOffset
let absoluteTop: CGFloat = 0
let absoluteBottom: CGFloat = scrollView.contentSize.height - scrollView.frame.size.height
let isScrollingUp: Bool = scrollDiff > 0 && scrollView.contentOffset.y > absoluteTop
let isScrollingDown: Bool = scrollDiff < 0 && scrollView.contentOffset.y < absoluteBottom
if !successView.isHidden && canAnimateHeader(scrollView) {
// Calculate new top constraint
let absConstraint = abs(self.headerTopConstraint.constant)
let absDiff = abs(scrollDiff)
var newTopConstraint: CGFloat = self.headerTopConstraint.constant
if isScrollingDown && scrollView.scrolledToTop {
newTopConstraint = -(max(self.minHeaderHeight, absConstraint - absDiff))
} else if isScrollingUp {
newTopConstraint = -(min(self.maxHeaderHeight, absConstraint + absDiff))
}
// Header needs to animate
if abs(newTopConstraint) != abs(self.headerTopConstraint.constant) {
self.headerTopConstraint.constant = newTopConstraint
self.updateHeader()
self.setScrollPosition(self.previousScrollOffset)
}
self.previousScrollOffset = scrollView.contentOffset.y
}
}
关于objective-c - Swift 函数需要很长时间才能编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45443691/