我們有一個混合的Obj-C/Swift項目。 Swift編譯需要非常長的時間。需要很長時間編譯的Swift函數
我使用以下來構建項目並收集函數時序。
xcodebuild -workspace Pay.xcworkspace -scheme Pay clean build 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
}
}
此定時在560ms爲編譯。
認爲它可能是一個類型推斷問題,我宣佈了scrollDiff(CGFloat)和isScrollingUp/isScrollingDown(Bool)的類型。
將編譯時間縮短到485ms。
我想不出還有什麼可能導致很長的編譯時間。我們有許多功能,所有時間都在1ms以上,有些顯着高於上面的例子。
我會很感激任何人可能有的指針。
絕對可能不需要那麼多首先。最大和最小工作與浮游物 – PeejWeej