45

ことはよく知られている.

コンパイルに 15 秒でもかかると、プログラマーはコンパイラーの実行中に退屈し、 The Onion の読み取りに切り替えます。

私たちの MonoTouch アプリは、Macbook Air でデバッグ/シミュレーター構成でコンパイルするのに 40 秒かかります。

ソリューションには約 10 個のアセンブリがあります。
また、一部のネイティブ ライブラリに対してgcc_flags.

私が気付いていないコンパイル時間を最適化する方法があると確信しています。これは、参照、リンカーなどに関係している可能性があります。

私よりも知識が豊富な人が、デバッグ ビルドの MonoTouch コンパイル時間を短縮するためのヒントとチェック事項のリストをコンパイルしてくれることを期待して、この質問をしています。

MonoTouchに直接関係のないハードウェアの最適化や最適化を提案しないでください。

4

3 に答える 3

45

Xamarin.iOS 6.4 でのビルド時間の改善

Xamarin.iOS 6.4 ではビルド時間が大幅に改善され、更新されたコードのビットのみをデバイスに送信するオプションが追加されました。自分で見て:

建造時間の改善
(ソース: xamarin.com )

詳細を読んで、Rolf の投稿でインクリメンタル ビルドを有効にする方法を学んでください。

Evolve 2013 ビデオ

このコンテンツの更新および拡張版は、私がEvolve 2013で行った高度な iOS ビルド メカニクストークのビデオで見ることができます。

元の回答

ビルド速度に影響を与える要因はいくつかあります。ただし、それらのほとんどは、あなたが言及したマネージド リンカーの使用を含め、デバイス ビルドにより大きな影響を与えます。

マネージド リンカー

デバイスの場合、Link allが最も速く、次にLink SDKと (最後に) Don't linkが続きます。その理由は、リンカーは、AOT コンパイラーがビルドできるよりも速くコードを削除できるためです (純利益)。また、.app が小さいほど、デバイスへのアップロードが速くなります。

シミュレーターの場合、AOT がない (JIT が使用される) ため、リンクしない方が常に高速です。テストする場合を除き、他のリンク オプションは使用しないでください (デバイス ビルドを実行するよりも高速です)。

デバイスのトリック

  • 単一のアーキテクチャ (ARMv7 など) の構築は、FAT バイナリ (ARMv7 + ARMV7s など) よりも高速です。アプリケーションが小さいということは、デバイスへのアップロード時間も短縮されるということです。

  • デフォルトのAOT コンパイラ (mono) は、LLVM コンパイラを使用するよりもはるかに高速です。ただし、後者はより良いコードを生成し、ARMv7s、Thumb2 もサポートします。

  • .app に大きなアセットがバンドルされている場合、アプリでそれらを (署名する必要があるため毎回) デプロイ/アップロードするのに時間がかかります。これを回避する方法についてのブログ投稿を書きました。大きなアセットがある場合は、多くの時間を節約できます。

  • オブジェクト ファイルのキャッシュは、MonoTouch 5.4 で実装されました。一部のビルドははるかに高速になりますが、(キャッシュをパージする必要がある場合) 高速にならないビルドもあります (ただし、低速になることはありません ;-)。これが頻繁に発生する理由の詳細については、こちらを参照してください)。

  • デバッグ ビルドは、シンボルや実行に時間がかかり、最終的dsymutilにサイズが大きくなるため、デバイスへのアップロードに余分な時間がかかります。

  • リリース ビルドは、既定で (オフにすることができます)、アセンブリの IL ストリップを実行します。これには少し時間がかかります - デバイスに (小さい .app) を展開するときに戻ってくる可能性があります。

シミュレーターのトリック

  • 前述のように、リンクには時間がかかり、(シンボリック リンクではなく) アセンブリをコピーする必要があるため、リンクは避けてください。

  • ネイティブ ライブラリを使用すると、共有のsimlauncherのメイン実行可能ファイルを再利用できず、gcc にアプリケーション用にコンパイルするように要求する必要があるため、処理が遅くなります (これは遅いです)。

いつでも迷わずついに!--time --timeつまり、プロジェクトに追加してextra mtouch arguments、各操作の後にタイムスタンプを表示できるということです:-)

于 2012-12-20T02:14:55.997 に答える
2

コンパイラが実行する必要があることをすべて理解していなければ、コンパイラが非常に高速であると期待することはできません。大規模なアプリケーションは当然、より長い時間がかかります。言語が異なれば、または同じ言語のコンパイラが異なれば、コードのコンパイルにかかる時間に大きな違いが生じる可能性があります。

コンパイルに約 2 分かかるプロジェクトがあります。最善の解決策は、コードをコンパイルする回数を減らす方法を見つけることです。

1行のコードを修正して再構築しようとする代わりに、何度も何度も。問題について話し合うために人々のグループを集めます。または、取り組みたい 3 つまたは 4 つのリストを作成し、すべてを完成させてからテストします。

これらはほんの一部の提案であり、すべての場合に機能するとは限りません。

于 2012-12-19T23:35:49.450 に答える