1つの長いコンストラクターで多くの計算を行う「MyComputation」というクラスがあります。(ディスクI / Oやネットワーク操作なしで)単独で実行すると、通常、実行に約20ミリ秒かかります。このクラスの約100個のインスタンスは、「ComputeParent」などの親クラスによって作成されます。このクラスは、それらを作業項目としてThreadPoolにキューに入れます。
ThreadPool.QueueUserWorkItem(myComputationCall, my_computation_data);
「myComputationCall」は次のようになります。
public static void myComputationCall(Object my_computation_data)
{
try
{
MyDataObject data = (MyDataObject)my_computation_data;
var computation_run = new MyComputation(data.parameter1, data.parameter2);
data.result = computation_run.result;
}
finally
{
if (Interlocked.Decrement(ref num_work_items_remaining) == 0)
done_event.Set();
}
}
done_eventは静的なManualResetEventです。
private static ManualResetEvent done_event;
...
done_event = new ManualResetEvent(false);
さまざまな入力パラメーターに対して、ComputeParentを約500回実行します。だから私はたくさんのネストされたクラスを持っています。問題は、ComputeParentの実行にかかる時間が徐々に長くなることです。特定のComputeParentを実行するのにかかる時間にはある程度のばらつきがありますが、時間はかなり着実に増加します(幾何学的には、連続する各反復はより長い時間かかります)。
プログラムのメモリ消費量は非常に高いですが(〜300MB)、時間の経過とともに目立って増加することはありません。8つの論理コアを備えたコンピューターで実行されており、プロセッサーの使用は非常にバースト的であるようです。他に何が問題に関連しているのかわかりません。
ComputeParentをバッチファイルで実行する必要はありませんが、これを実行しても問題は発生しないようです。