我们有一个混合的Obj-C / 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
}
}
此时间为560毫秒进行编译。
认为它可能是类型推断问题,我声明了scrollDiff(CGFloat)的类型,并且isScrollingUp / isScrollingDown(Bool)。
这将编译时间缩短到了485ms。
我想不出还有什么可能导致编译时间过长。我们有许多功能,所有时间都超过1毫秒,有些功能显着高于上例。
我很感激人们可能有的任何指示。
答案 0 :(得分:1)
我知道现在这并不是什么安慰,但是当你可以升级到Xcode 9时,你可能会看到开箱即用的改进。我说这是因为,因为我的RetinaBook目前在商店里取代了它的电池,我在一个古老的2008 MBP上测试这个,它甚至不能运行这个软件(我不得不应用黑客来得到塞拉安装),即使使用这种老式的管道录制硬件,Xcode 9仅在181.73ms内编译您的示例。
说到这一点,我能够通过分离出abs()调用将其降低到87.93ms,所以你可能想尝试一下,看它是否同样将你的编译时间减半。
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
}
}