2017-08-01 54 views
0

我们有一个混合的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以上,有些显着高于上面的例子。

我会很感激任何人可能有的指针。

回答

1

我知道现在没有太多安慰,但是当您升级到Xcode 9时,您可能会看到开箱即用的改进。我之所以这么说是因为,由于我的RetinaBook目前正在更换电池的商店里,我正在测试2008年的一个古老的MBP,它不应该能够运行这个软件(我必须应用黑客技术得到Sierra安装),甚至使用这款老旧的导管式硬件,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 
    } 
} 
+0

绝对可能不需要那么多首先。最大和最小工作与浮游物 – PeejWeej