【发布时间】:2012-09-19 16:34:31
【问题描述】:
我写了一个类,它使用Stopwatch 来分析方法和for/foreach 循环。使用for 和foreach 循环,它会针对Parallel.For 或Parallel.ForEach 实现测试标准循环。
你会像这样编写性能测试:
方法:
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 = 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 核机器上进行测试。
【问题讨论】:
-
如果你投反对票,你能解释一下原因吗!
-
错误的计时方法,并使用了对现实世界没有好处的微基准。像这样的东西。制定一个可以证明任何事情的基准是一种小技巧。
-
忽略第一次运行,代码正在 JITted。我怀疑第二次运行的缓慢与此有关,但我不知道。
-
除了 Loren 所说的之外,执行工作的时间可能非常短,以至于您所测量的只是围绕该工作的开销。另外,请注意,秒表测量的是时钟时间,而不是 CPU 时间,因此它会受到计时测试期间运行的其他事物的影响。
-
@hatchet,我使用秒表的原因与我之前提出的问题有关,并得到了这个答案:stackoverflow.com/a/12618494/1033686。但是如果你说我需要测量 CPU 时间,那么 .NET 有什么可以促进这个吗?
标签: c# .net performance profiling performance-testing