我写了一个类,它使用Stopwatch
来剖析方法和for/foreach
循环。使用for
和foreach
循环,它将针对Parallel.For
或Parallel.ForEach
实现测试标准循环。NET中的性能分析
你会写性能测试,像这样:
方法:
PerformanceResult result = Profiler.Execute(() => { FooBar(); });
For循环:
SerialParallelPerformanceResult result = Profiler.For(0, 100, x => { FooBar(x); });
ForEach循环:
SerialParallelPerformanceResult result = Profiler.ForEach(list, item => { FooBar(item); });
每当我进行的测试,我将它们放在一个循环,这样我可以看到随着时间的性能变化(的.Execute
,.For
或.ForEach
一个)。的性能
实施例可能是:
方法执行1 = 200毫秒
方法执行2 = 12ms的
方法执行3 = 0毫秒
对于执行1 = 300毫秒(串行),100ms的(并行)
对于执行2 = 20毫秒(串行),75ms(并行)
对于执行3 = 2ms的(串行),50毫秒(并行)
的ForEach执行1 = 350毫秒(串行),300毫秒(并行)
的ForEach执行2 = 24MS(串行),89ms(并行)
的ForEach执行3 = 1毫秒(串行),21ms(并行)
我的问题是:
为什么性能会随着时间的推移而改变,.NET在后台做些什么来促进这一点?
如何/为什么串行操作比并行操作更快?我已经确定我使操作复杂以正确地看到差异......在大多数情况下,串行操作似乎更快!
注:对于并行处理我正在测试的8芯的机器上。
f你投票下来,你能解释为什么吗? – series0ne
测量时间的错误方法,以及使用没有实际益处的微观基准。像这样的东西。有一点技巧可以制定一个实际可以证明任何事情的基准。 – TomTom
忽略第一次运行,代码得到了JITted。我怀疑第二轮的缓慢与此有关,但我不知道。 –