web-dev-qa-db-ja.com

MonoTouchのコンパイル時間を短縮するにはどうすればよいですか?

それは よく知られている それです

コンパイルに15秒もかかる場合、コンパイラーの実行中にプログラマーは退屈し、読み取りに切り替えます The Onion これにより、プログラマーは吸い込まれ、何時間もの生産性が失われます。

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

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

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

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

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

44
Dan Abramov

Xamarin.iOS6.4でのビルド時間の改善

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

Built time improvements
(ソース: xamarin.com

詳細を読み、インクリメンタルビルドを有効にする方法を学びます Rolfの投稿

Evolve2013ビデオ

このコンテンツの更新および拡張バージョンは、高度なiOSビルドメカニズムで行った講演のビデオで見ることができます- Evolve 201

元の回答

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

マネージリンカー

devicesの場合、Link allが最も速く、次にSDKをリンクし、(最後に)リンクしない。その理由は、リンカーがAOTコンパイラーがコードを構築するよりも速くコードを排除できるためです(純利益)。また、小さい.appはデバイスへのアップロードが速くなります。

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

デバイストリック

  • 単一のアーキテクチャ(例:ARMv7)の構築は、FATバイナリ(例:ARMv7 + ARMV7)よりも高速です。アプリケーションが小さいほど、デバイスにアップロードする時間が短くなります。

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

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

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

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

  • リリースビルドは、デフォルトで(オフにすることができます)、アセンブリのILストリップを実行します。これには少し時間がかかります。デバイスに(小さい.app)をデプロイすると、おそらく元に戻ります。

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

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

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

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

45
poupou

これは実際には答えとしてではなく、より良いものが見つかるまでの一時的なプレースホルダーです。
私は見つけました Sebによるこの引用

プロジェクトのビルドオプションを見て、「リンカーの動作」がデフォルトの「LinkSDKアセンブリ」になっていることを確認します。

「リンクしない」と表示されている場合は、非常に長いビルド時間が発生します(その大部分はdsymutilにあります)。

ただし、このオプションを選択すると、MonoDevelopに警告サインが表示され、パフォーマンスにあまり影響を与えないように見えるため、それがまだ関連しているかどうかはわかりません。

4
Dan Abramov

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

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

1行のコードを修正して再構築する代わりに、何度も何度も繰り返します。人々のグループを集めて問題について話し合います。または、作業したい3つまたは4つのリストを作成し、それらをすべて完了してからテストします。

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

3
Jastill