2017-08-01 83 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