2

実行時に複数のアセンブリを作成しようとしています。Roslyn を使用して、各アセンブリをシリアルにコンパイルしています。

Roslyn は単一の dll をコンパイルするために内部的にマルチスレッドを使用しているため、マルチスレッドを活用できません。Roslyn を使用した単一の dll のコンパイル時間は CodeDom のコンパイル時間よりも短くなりますが、CodeDom を使用すると複数の dll を並列コンパイルできるため、CodeDom の実際の時間ははるかに短くなります。

Roslyn コンパイルの並行ビルド オプションを false に設定してから、コードでマルチスレッドを使用しようとしましたが、1 つの dll のコンパイル時間が長くなるため、これも効率的ではありません。この問題の回避策があるかどうか疑問に思っています

タイミング解析の更新:

私は8コアのプロセッサを持っています。72 個の dll をコンパイルするために使用するさまざまなファイル セットがディスク上にあります。

foreach最初のケースでは、ファイルから構文ツリーを作成し、参照を作成し、オプションを作成し、単純なループを使用して、各 dll に対して Emit を使用して dll をコンパイルします。合計 488589 ミリ秒かかります

2 番目のケースでは、parallel.ForEachwithを使用してMaxDegreeOfParallelism = 7構文ツリーを作成し、参照を作成し、オプションを作成し、ループで Emit を使用して dll をコンパイルしています。合計 514481 ミリ秒かかります

どちらの場合も、同時ビルド オプションはデフォルトの True です。

ご覧のとおり、マルチスレッドを使用している間は何のメリットもありません。

4

0 に答える 0