我正在做并行编程的第一步。我将CalculateSlots重写为CalculateSlotsAsync。它接缝工作正常(快3倍)。并行计算。 NET 4.0
我的问题是:它写的是否正确? 我是否需要使用最新的异步脱节模式,如果是,如何?
strategy.Slot.AsParallel()
.Where(slot => isCalculateAllSlots || !indicatorSlot.IsCalculated)
.ForAll(slot => CalculateStrategySlot(slot.SlotNumber));
然而,你的情况:
private void CalculateSlots(bool isCalculateAllSlots)
{
foreach (IndicatorSlot indicatorSlot in strategy.Slot)
{
if (isCalculateAllSlots || !indicatorSlot.IsCalculated)
CalculateStrategySlot(indicatorSlot.SlotNumber);
}
}
private void CalculateSlotsAsync(bool isCalculateAllSlots)
{
var tasks = new List<Task>();
foreach (IIndicatorSlot indicatorSlot in strategy.Slot)
{
if (isCalculateAllSlots || !indicatorSlot.IsCalculated)
{
IIndicatorSlot slot = indicatorSlot;
Task task = Task.Factory.StartNew(() => CalculateStrategySlot(slot.SlotNumber));
tasks.Add(task);
}
}
Task.WaitAll(tasks.ToArray());
}
上i7-3630QM测试@ 2.40Gh
// Executed for 96 sec.
for (int i = 0; i < 1000; i++)
CalculateSlots(true);
// Executed for 34 sec.
for (int i = 0; i < 1000; i++)
CalculateSlotsAsync(true);
代码审查不是SO的目的。代码看起来不错,但可以用(P)Linq和/或Parallel.ForEach()简化。 –
我使用两年以来的SO,但仍不明白它的目的究竟是什么。我真的很害怕在这里问问题或者特别回答。在这里阅读询问在其他地方... –
@MiroslavPopov:我认为Henk意味着[代码评论](http://codereview.stackexchange.com/)网站可能更适合这些类型的问题。但不要害怕提问;可能发生的最糟糕的情况是它会在没有收到任何答案的情况下关闭。 – Douglas