コードを調整して、swiftのコンパイルを加速します.

3347 ワード

著者連結:興味のあるプログラマー:http://www.jianshu.com/users/94b6bbf8765a/latest_アートレス
0 x 00はコンパイル速度の問題に遭遇しました.
アップルはswift言語を強力に推進していますが、swift言語はあまりよくないです.
swift 1.2から実際のプロジェクトにswift言語を導入しました.もう一年以上経ちました.最近問題が発生しました.プロジェクトのコンパイル速度がだんだん遅くなりました.20分ぐらいになりました.ネットでも似たような問題を言う人が多いです.
コンパイル速度は直接に開発効率に影響します.
一定の研究と実験を行った後、いくつかの可能な改善方法が発見されました.
0 x 01編集swiftの翻訳速度をチェックします.
  • コンパイル構成に設定し、コンパイル時間情報を出力します.Other Swift Flas追加設定:-Xfrontend-debug-function-bodies;
  • は、build情報を文書ドキュメントdebug_に保存するbuildを実行する.buld_info.txt;
  • は、すべての方法のコンパイル時間を抽出し、コンパイル時間に応じて、長いものから短いものへと情報を並べ替えます.grep[1-9]、[0-9]ms debug_build_info.txt(124)sort-nr>>build_slow.txt;
  • コンパイル時間が長い方法を確認し、修正を行う.
  • 検査によって、プロジェクトのコンパイル時間が500 msを超える方法がたくさんあります.これはコンパイル速度が遅い大きな元凶です.重点的に彼らを修正しました.
  • .
    0 x 02で発見された影響swiftコンパイル速度の要因
    1.コンパイルパラメータ
    swiftコンパイルの最適化オプションを開いていますか?whole module optimizationは、ある程度コンパイル速度に影響を与えます.Debugでオフすることができます.Releaseコンパイルの場合、オフには適しません.
    2.タイプの導出:
    タイプガイドは、コンパイルの速度が遅くなる原因かもしれません.ネット上では、非常にスペクトルから逸脱した例があります.コードのコンパイル時間が24時間を超えています.コードの内容は入れ子辞書の定義を初期化しただけです.このバグは今年の4月に発見されました.まだ存在しています.swiftは設計理論に欠陥があると推測します.したがって、この問題は解けません.以下はタイプ導出の例です.
  • 遅い
  • let createDate = NSDate(timeIntervalSince1970:interval) //  (  )          
    if (doubleNum/60 < 1) { //              
    var strings: [String] = [] //           
    
  • 快速
  • let createDate:NSDate = NSDate(timeIntervalSince1970:interval)
    if (doubuleNum/60.0 < 1.0) {
    var strings: [String] = [String]()
    
    3.計算する表式
    表式に定数がある場合、コンパイラはコンパイラで計算することができます.コンパイラで計算するとコンパイラの速度が上がります.
  • 遅い
  • let t=24*60*60*1000
    
  • 快速
  • let t=86400000 //24*60*60*1000
    
    4.複雑な表現
    複雑な表現の処理は、swiftコンパイラの弱さです.やや複雑な点の表現は、コンパイルに失敗することもあります.多くの人が会ったはずです.また、複雑な表現もコンパイル速度が遅くなります.
  • 遅い
  • txt = (note?.text ?? "") + "
    " + selectedText
  • 快速
  • txt = note?.text ?? ""
    txt += "
    " txt += selectedText
    5.長すぎるチェーン操作
  • 遅い
  • r=a.func1().func2().func3()
    
  • 快速
  • let b=a.func1()
    let c=b.func2()
    r=c.func3()
    
    6.配列+操作
    配列の+演算子の使用は、コンパイル速度を著しく低下させます.エレガントな書き方ですが、現在は適切ではありません.
  • 遅い
  • let all = redBooks + greenBooks + yellowBooks 
    
  • 快速
  • var all:[Book]=[Book]() //      
    for b in redBokks {
        all.append(s) //     +
    }
    for b in greenBokks {
        all.append(s)
    }
    for b in yellowBokks {
        all.append(s)
    }
    
    7.印刷関数
    不debugの時、printを注釈します.
    8.コードの警告
    コード中の警告は必ず処理してください.
    0 x 03その他
    1.追加
    他にもいくつかのコンパイル速度を高める方法がありますが、Swiftに対しても、ocは同じように有効ですので、詳しくは言いませんでした.例えば、frame work/libで置換するとコンパイルが必要なcocococoappods管理のコード(これは明らかです.)をコンパイルし、マルチスレッドコンパイルを設置し、より性能の良いコンピュータでDebug Information FormatをDWARFに変更します.
    2.感想
    以前、学校に行った時、コンパイラの原理を勉強しました.この授業が大好きです.でも、今度は役に立つと思いませんでした.
    3.参考
  • https://panupan.com/2016/02/16/how-to-speed-up-slow-swift-compile-times/
  • https://thatthinginswift.com/debug-long-compile-times-swift/
  • https://www.amazon.cn/%E7%BC%96%E8%AF%91%E5%8E%9F%E7%90%86-Alfd-V-Aho/dp/B 001 NGO 85 I/ref=sr_1_1?ie=UTF 8&qid=1476589755&sr=8-1&keywords=%E 7%BC%96%E 8%AFC%91%E 5 E%9 F%E 7%90%
  • http://blog.csdn.net/zhaoxy_thu/articale/detail/3003485