测量Parallel.For的执行时间

Arc*_*val 6 .net c#

我正在使用Parallel.For循环来提高计算的执行速度.

我想测量计算剩下的大致时间.通常,只需要测量每个步骤所需的时间,并通过将步骤时间乘以步骤总数来估计总时间.

例如,如果有100个步骤并且某个步骤需要5秒钟,那么除了总时间约为500秒之外,其中一个步骤可以.(可以平均几个步骤并不断向用户报告我想做的事情).

我能想到的唯一方法就是使用一个外部for循环,它基本上通过拆分parallel.for间隔并测量每个循环来回归到原始方式.

for(i;n;i += step)
    Time(Parallel.For(i, i + step - 1, ...))
Run Code Online (Sandbox Code Playgroud)

这通常不是一种非常好的方法,因为少数非常长的步骤或大量的短步骤会导致计时问题.

有人有主意吗?

(请注意我需要实时估算parallel.for完成的时间,而不是总时间.我想让用户知道执行剩余的时间).

car*_*ett 0

我建议在完成后在每个步骤报告中执行该方法。当然,这对于线程安全来说有点棘手,所以在实现时要记住这一点。这将使您能够跟踪已完成任务的总数,并且还可以(在某种程度上)轻松了解每个单独步骤所花费的时间,这对于消除异常值等很有用。

编辑:一些代码来演示这个想法

Parallel.For(startIdx, endIdx, idx => {
    var sw = Stopwatch.StartNew();
    DoCalculation(idx);
    sw.Stop();
    var dur = sw.Elapsed;
    ReportFinished(idx, dur);
});
Run Code Online (Sandbox Code Playgroud)

这里的关键是,它将ReportFinished为您提供有关已完成任务的数量以及每个任务的持续时间的连续信息。这使您可以通过对此数据进行统计来更好地猜测剩余时间。