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

标签 objective-c swift xcode

我们有一个混合的 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/

相关文章:

xcode - 如何纠正我的 .h 文件将其 IBOutlets 链接到另一个项目中的 XIB 文件的事实?

iphone - iOS 中 UI 工具栏的导航

ios - 通过触摸 UILabel 打开另一个 View Controller

ios - UIImage 无法保存到文档文件夹 ios

objective-c - 如何以编程方式从 View 层次结构中的另一个 subview 引用 subview ?

ios - 我正在尝试创建自定义 firebase 数据库类,但不断出现错误

iphone - 如何为 iOS 私有(private) api (MobileWifi.framework) 添加授权

IOS self->isa deprecated 但 Object_setClass 也给出警告

ios - 从协议(protocol)中刷新数据

javascript - iOS 在打开时在 testFlight 中崩溃