我写了一个Stopwatch
用于分析方法和for/foreach
循环的类。使用for
andforeach
循环它会针对 a Parallel.For
orParallel.ForEach
实现测试标准循环。
你会像这样编写性能测试:
方法:
PerformanceResult result = Profiler.Execute(() => { FooBar(); });
对于循环:
SerialParallelPerformanceResult result = Profiler.For(0, 100, x => { FooBar(x); });
ForEach 循环:
SerialParallelPerformanceResult result = Profiler.ForEach(list, item => { FooBar(item); });
每当我运行测试(其中一个.Execute
,.For
或.ForEach
)时,我都会将它们放在一个循环中,这样我就可以看到性能如何随时间变化。
性能示例可能是:
方法执行 1 = 200ms
方法执行 2 = 12ms
方法执行 3 = 0ms
执行时 1 = 300ms(串行)、100ms(并行)
执行时 2 = 20ms(串行)、75ms(并行)
执行时 3 = 2ms(串行)、50ms(并行)
ForEach 执行 1 = 350ms(串行),300ms(并行)
ForEach 执行 2 = 24ms(串行),89ms(并行)
ForEach 执行 3 = 1ms(串行),21ms(并行)
我的问题是:
为什么性能会随着时间而变化,.NET 在后台做了什么来促进这一点?
串行操作如何/为什么比并行操作更快?我已确保我使操作复杂化以正确查看差异......在大多数情况下,串行操作似乎更快!?
注意:对于并行处理,我正在 8 核机器上进行测试。