2017-10-12 10 views
4

私は現在、自分のプロジェクトのコンパイル時間を最適化しようとしています。私はいつもモジュール全体の最適化のようなものがあることを知っていましたが、ビルドの設定でそれをチェックするのではなく、実際に深く掘り下げていませんでした。私はそれを理解したようユーザー定義のSWIFT_WHOLE_MODULE_OPTIMIZATIONとSwift最適化レベルの違いは何ですか?

WMOは速く実行されるコードを生じるはずであるが、代わりに並行して個別に各ファイルをコンパイルするの1つの全体としてモジュール全体のファイルをコンパイルするために、わずかに、コンパイル時間を増やすことができます。 https://swift.org/blog/whole-module-optimizations/

だから、スウィフト最適化レベルを設定することをお勧めします:それは最高のコンパイルを持っていることは重要ではありませんよう Fast, Whole Module Optimization [-O -whole-module-optimization] に設定コンフィギュレーションをリリースためNone [-Onone]

  • に設定デバッグ設定に

    • を時折のリリースビルドの時間

    しかし、その後のデバッグコンフィギュレーションのコンパイル時間を減少させるためのいくつかのヒントを研究するとき、私はこのユーザー定義設定が見つかりました:

    • SWIFT_WHOLE_MODULE_OPTIMIZATION = YES(リリース用)
    • SWIFT_WHOLE_MODULE_OPTIMIZATION = NO

    (デバッグ用)この設定はで、私のDEBUGコンパイル時間はほぼ半分になりましたしかし、それも私を混乱させます。 この設定とその設定の元になったドキュメントは見つかりませんでした。 は(SWIFTコンパイラの私の理解では、非常に基本的である、と私は前にユーザー定義の設定では動作しませんでした)

    みんなはただの理由を説明、またはではないだろう説明もなく、コンパイル時間を短縮するためにそれを推奨しています上記のSwift Optimization Levelとの競合。

    私が理解しているように、この設定をYESに設定すると、wmoを有効にするためのコンパイル時間が長くなるはずです。 したがって私はwmo、またはこの特定の設定の私の理解が間違っていると思います。

    だから、私の質問は以下のとおりです。

    1. Swift Optimization Level設定とSWIFT_WHOLE_MODULE_OPTIMIZATIONの違いは何ですか?

    2. なぜSWIFT_WHOLE_MODULE_OPTIMIZATIONがコンパイル時間を短縮しますか?

    ありがとうございます!

  • 答えて

    3
    1. 主な違いは、whole-module-optimizationは、コンパイラがモジュールを最適化する方法を参照しSwift Optimization Levelは、各ファイルのコンパイルを参照していることです。 Swift Optimization Levelhereのさまざまなフラグの詳細を読むことができます。
    2. SWIFT_WHOLE_MODULE_OPTIMIZATIONコンパイラは、ファイル間のすべての関数、メソッド、およびリレーションに関するグローバルなビューを持ち、未使用関数を無視したり、コンパイル順序を最適化したりすることができるため、コンパイル時間を改善します。また、変更されたファイルのみをコンパイルすることにも焦点を当てています。つまり、そのフラグをアクティブにしても、プロジェクトをクリーンアップし、派生したデータフォルダを削除しても、最初の実行時にはコンパイル時間は長くなります。
    +0

    ありがとうございました!私はそれを得るか分からないので、私と一緒に耐えてください。 一般的にwmoはコンパイル時間を短縮しますが、 - Swift Optimization Levelですべてのファイルに対して有効にすると、ビルドごとにすべてのファイルがコンパイルされるので、それは悪いオプションと考えられます。しかし、それは解放のために大丈夫です。 - 'SWIFT_WHOLE_MODULE_OPTIMIZATION'でそれを有効にし、それを各ファイルに対して無効にすると、変更されたファイルだけがコンパイルされるため、より高速です。 これが正しいですか? – CatDamon

    +0

    '-wmo'は* module *オプションです。これを有効にすると、コンパイラにすべてのファイルに対するグローバルビジョンが与えられ、プロジェクト全体が1つにコンパイルされます。これにより、コンパイラーは各ファイルで何が変更されたのか、それがどのように他のファイルに影響を与え、必要なものをコンパイルするための決定を最適化するのかを知るため、時間が短縮されます。 * Swift Optimization Level *は、 '-wmo'オプションが有効かどうかにかかわらず、各ファイルの処理方法を示すフラグです。 ** TL; DR **、はい、あなたは正しい – jvrmed

    関連する問題