WindowsでのCreateProcessは、最良の場合は低速であり、Chrome開発者は、最良の場合ではないことに気付くことがよくあります。 Chromeビルドで過去数年間に対処されたプロセスの作成/破棄の問題には次のものがあります。
Chromeビルドに影響を与えなかったその他のプロセスの作成/破棄の問題は次のとおりです。
現在、これらの問題はすべて軽減されていますが、MsMpEng.exeを除いて、すべてが除外されたフォルダーにある場合でも、ゼロ以外のオーバーヘッドが発生します。 ただし、すべてのChrome開発者のマシンを適切に構成し続けるために継続的な努力が必要であり、適切なビルドパフォーマンスを維持するために必要な多くの除外のために、セキュリティがいくらか失われます。 これらの問題を検出して調査するための継続的な取り組みもあります。
ある時点で、CreateProcess風車で傾ける価値がなくなり、代わりにCreateProcessを頻繁に呼び出すことを避けます。 ninja.exeは、ビルド中にCreateProcess呼び出しの99%を回避するために、IPCを使用してコンパイルプロセスのプール(gomaおよび/またはclang-cl)を管理するローカルサーバープロセスと通信する方法を教えることができます。
これを行うと、CreateProcessのCPUコストが削減され、忍者のシリアル化されたクリティカルパスからCreateProcessが削除され、より少ない除外でより多くのセキュリティモニタリングが有効になり、将来のリグレッションのコスト(調査時間とビルド時間)から節約できます。 。
あるいは、忍者はCreateProcessをマルチスレッド化することもできますが、これは完全なソリューションではありません。
忍者でCreateProcessからIPCに切り替えることは明らかに正しいことではありませんが、議論する価値があります。 プロトタイプが作成されたので、テスト結果をここで共有する必要があります。
ライブラリ化するNinjaを使用すると、インターフェイスクラスから派生してプロセス作成の動作をカスタマイズするなど、必要な動作をより簡単に注入できるようになります。
当然のことながら、私はこれに強く反対します。 Ninjaは、ビルド環境が正常であることを前提としたシンプルなビルドシステムです。 敵対的なビルド環境を想定している可能性のある異なるデザインのビルドシステムは他にもありますが、忍者はそのシステムではありません。
忍者の現在のデザインは、修正する価値のある多くのバグを特定するのに役立つようです。 これは機能だと思います。
@nico 、私はこの問題についてのあなたの意見に強く反対します。
まず、Ninjaは、Chromeプロジェクトのコンパイル時間を改善するためのツールとしてスタートしました。 http://neugierig.org/software/chromium/notes/2011/02/ninja.html
今、あなたはchromeプロジェクトのコンパイル時間を改善する方法について話している誰かに彼らの貢献は歓迎されないことを伝えています。
Ninjaは、最初にグラフ実行ライブラリで、次にビルドツールである場合、IPCを使用してビルドジョブを実行することに簡単に対応
さらに、このような高度なバグレポートをめったに見ないプロジェクトの「保守者」として(実際のコードをフォローアップするという暗黙の約束があります)、トピックについてまったく議論せずにこれを閉じるのはかなりばかげていますが、未解決のまま残っている189の他の問題、8歳もの古いものもあります。
そしてもちろん、Windowsを敵対的なビルド環境と呼ぶことは真実かもしれませんが、貢献を無視することの正当な理由ではありません。 Windowsは今でも最も広く使用されている開発オペレーティングシステムの1つであり、それを無視することはせいぜい不誠実です。
@nicoNinjaプロジェクトから離れることをお勧めします。 数か月でのあなたの唯一の行動は、追求されてきた問題と解決策を説明する大量の文書とともに、洗練された貢献を却下することです。
@randomasciiここであなたが話しているような貢献が忍者に統合されるのを見てうれしいです。 私の最後の職場では、このようなIPCメカニズムによって、ビルドごとに少なくとも数分短縮できたのではないかと強く思っています。これはすばらしいことです。
コンパイルプロセスのプールがどのように管理されるかについて詳しく説明していただけますか? Windowsには、プロセスを再利用して他の何かを実行できるメカニズムがありますか? それとも、コンパイラプロセスが再利用可能である必要がありますか?
私の理解では、同僚は忍者とIPCのプロトタイプを持っています。
これ以上議論せずにこれを閉じることについての私の主な懸念は、セキュリティのトレードオフについて議論する機会を逃していることです。 CreateProcessのコスト/シリアル化を軽減する方法のほとんどは、さまざまなセキュリティチェックを無効にすることです。 私はそれらのチェックの価値についての専門家ではありませんが、専門家である人々にそれらを可能にすることができることの利点について検討してもらうことは有益かもしれません。
実装について話し合うことができるように、同僚がここgithubでプロトタイプを使用してプルリクエストを送信することをお勧めします。