Swift函数需要很长时间才能编译

时间:2017-08-01 16:58:04

标签: objective-c swift xcode

我们有一个混合的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毫秒,有些功能显着高于上例。

我很感激人们可能有的任何指示。

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
    }
}