TPLスロットリングでパフォーマンスの低下を制限する方法はありますか?TPL - ExecutionDataflowBlockOptions defined BoundedCapacity degraetes performane
複雑なパイプラインのコンポーネントがあり、必要なメモリ要件を制限しようとしています。私は複数のファイルから並列に読み込み、パイプラインのコンポーネントはそれらのファイルのランダムな部分からいくつかの追加読み取りを行い、残りのコンポーネントはCPUバインド操作を行います。
一般的なテスト方法を使用してパフォーマンステストベンチをこれらのテストに単純化しました。
private void TPLPerformaceTest(int generateNumbers, ExecutionDataflowBlockOptions transformBlockOptions)
{
var transformBlock = new TransformBlock<int, int>(i => i, transformBlockOptions);
var storedCount = 0;
var generatedCount = 0;
var store = new ActionBlock<int>(i => Interlocked.Increment(ref storedCount));
transformBlock.LinkTo(store);
transformBlock.Completion.ContinueWith(_ => store.Complete());
for (int i = 0; i < generateNumbers; i++)
{
transformBlock.SendAsync(i).Wait(); //To ensure delivery
Interlocked.Increment(ref generatedCount);
}
transformBlock.Complete();
store.Completion.Wait();
Assert.IsTrue(generatedCount == generateNumbers);
Assert.IsTrue(storedCount == generateNumbers);
}
何スロットルがないことを最初に。私のCPUで約12sが完了し、約を消費し、RAMの800MBを消費し、平均CPU使用率は約35%です。
[Test]
public void TPLPerformaceUnlimitedTest()
{
var generateNumbers = 100000000;
this.TPLPerformaceTest(generateNumbers,new ExecutionDataflowBlockOptions());
}
だけint.MaxValueにBoundedCapacityを設定する第2のテスト、このように、まったく制限しません完了するために、20-30sをとり、RAMおよび平均CPU使用率の2.1ギガバイト約ある消費50%。マニュアルによると、BoundedCapacityはデフォルトでint.MaxValueに設定する必要があるため、パフォーマンスの低下の理由はわかりません。
[Test]
[Sequential]
public void TPLPerformaceBounedCapacityTest()
{
var generateNumbers = 100000000;
this.TPLPerformaceTest(generateNumbers,new ExecutionDataflowBlockOptions()
{ BoundedCapacity = Int32.MaxValue });
}
generateNumbers/1000に第3の試験限界BoundedCapacity、エルゴ100000それが完了するまでに60秒かかり、RAM、平均CPU使用率の450メガバイト約60%で消費します。
[Test]
[Sequential]
public void TPLPerformaceBounedCapacityTenthTest()
{
var generateNumbers = 100000000;
this.TPLPerformaceTest(generateNumbers,new ExecutionDataflowBlockOptions()
{ BoundedCapacity = generateNumbers/1000 });
}
マニュアルに従って制限なし-1第四の試験限界MaxDegreeOfParallelism。それはRAMの27GBを消費し、平均CPU使用率は約85%であり、5分で終了しませんでした。
[Test]
[Sequential]
public void TPLPerformaceMaxDegreeOfParallelismTest()
{
var generateNumbers = 100000000;
this.TPLPerformaceTest(generateNumbers, new ExecutionDataflowBlockOptions()
{ MaxDegreeOfParallelism = -1 });
}
すべてのメソッドがパフォーマンスに非常に影響するようですが、私の妥当な期待のために動作しません。