これが私の質問の小さなイラストです:
A-Dという名前の4つの独立したタスクで構成されるビルドジョブを想定します。 DはA-Cよりも時間がかかります。
相対的なタスク時間を組み込むことができないビルドシステムでは、次のようにタスクをスケジュールできます。
---------------------------------------
CPU1: A | C |
---------------------------------------
CPU2: B | D |
---------------------------------------
対照的に、スケジューラーがタスクの時間差を認識している場合は、次のはるかに短いスケジュールが考えられます。
---------------------------------------
CPU1: A | B | C |
---------------------------------------
CPU2: D |
---------------------------------------
私の質問:
Microsoft Visual Studio Team System(以前のTFS)は、ビルドアクション時間と並列ビルドを考慮しています。以前のビルド履歴からデータを取得します。必要な動作をそのまま使用できるとは思いませんが、カスタマイズできる場合があります。
パフォーマンスの最適化に取り組むいくつかのカスタムタスクの例
https://veegens.wordpress.com/2013/03/26/tfs-2010-build-performance-report/
これは、タスクの「ビルド」が非並列であるという誤った仮定に基づいています。
多くのコンパイラはマルチスレッドで動作するため、単一のタスクAがすべてのCPUを使用します。したがって、順序は関係ありません。特にネットワーキングを含むI/Oバウンドタスクの場合は、最初からすべてを並行して開始することをお勧めします。ほとんどの時間は、応答を待つために費やされます。
つまり、個々のタスクは通常並列化されているため(たとえば、コンパイルなど)、順序は関係ありません。
編集:
実際、この「CPU 1のタスクA」の概念にも欠陥があります。シングルスレッドタスクの場合でも、プロセス/スレッドをスケジュールするOSは、各コンテキストスイッチでCPUからCPUにそれをホップすることがあります。ほとんどのビルドシステムはすべてのタスクを並行して実行し、OSにスケジューリングを任せると思います。タスクが長いほど時間がかかりますが、それだけです。
I/Oバウンドではない長時間実行されるシングルスレッドタスクがあると仮定すると、ビルドシステムに優先度/重要度を割り当てる方がはるかに簡単です。むしろ、OSからのコンテキスト切り替えを減らすために、より小さなタスクを遅らせることを試みます。
このようなstrangeタスクがある場合でも、これは実際には非常にまれであり、以前の実行に基づいてヒューリスティックに動作する豪華なスケジューリングビルドシステム(知る唯一の方法)、それから得られる利点はかなり小さいかもしれません...しかし、維持するために追加された複雑さの束を得ます。