我有一个类,比如“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,尽管完成后似乎不会出现问题。