我实现了一种从并行选择报告进度的方法。它工作正常。但在查看堆栈溢出类似问题的一些答案后,我想知道我的方法是否过度或者是否有价值。
我当前的方法与不报告进度并在整个集合上执行AsParrallel一样快。但我感兴趣的是12个线程的限制。这可能会如何影响其他机器的性能。
int count = ids.Count();
const int takeValue = 12;
List<ImportantDataDecorator> parrallel = new List<ImportantDataDecorator>();
for (int i = 0; ids.Count > 0; i += takeValue)
{
int take = takeValue;
if (take > ids.Count)
{
take = ids.Count;
}
var idsToProcess = ids.Take(takeValue);
var processed = idsToProcess.AsParallel().Select(x =>
{
var value = GetValue(x, divBuffer, mask);
return new ValueDecorator(value, x);
}).ToList();
parrallel.AddRange(processed);
ids.RemoveRange(0, take);
int remaining = i;
float percent = (remaining/(float)count) * 100.0f;
if (backgroundWorker != null)
{
backgroundWorker.ReportProgress((int) percent);
if (backgroundWorker.CancellationPending)
return;
}
}
答案 0 :(得分:1)
拆分工作并报告进度似乎并没有占用太多的计算时间。但该应用程序正在做一些(即使很少)工作。
我目前的方法与不报告进度和做法一样快 整个集合中的AsParrallel
您可以使用更大的数据尝试您的方法,并对这两种策略进行基准测试并选择更好的策略。
然而,拆分处理和执行报告返回进度的其他工作将花费您一些额外的时间(对于非常大的数据,这将是显而易见的)。您应该决定Progress
报告是否为您的应用程序增加了值,以弥补额外的时间。
AsParallel()
取决于各种因素,例如计算负载,系统核心数等。这种特殊方法可能在您的系统中运行得更快,在计算能力更低的系统上表现更差。
请参阅此链接以加快PLINQ:https://msdn.microsoft.com/en-us/library/dd997399(v=vs.110).aspx