gpt4 book ai didi

c# - .NET 中的性能分析

转载 作者:行者123 更新时间:2023-11-30 15:02:27 25 4
gpt4 key购买 nike

我写了一个类,它使用 Stopwatch 来分析方法和 for/foreach 循环。使用 forforeach 循环,它针对 Parallel.ForParallel.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 execution 3 = 1ms (Serial), 21ms (Parallel)

我的问题是:

  1. 为什么性能会随着时间的推移而变化,.NET 在后台做了什么来促进这一点?

  2. 串行操作如何/为什么比并行操作更快?我已经确保我使操作变得复杂,以便正确地看到差异......在大多数情况下,串行操作似乎更快!?

注意:对于并行处理,我在 8 核机器上进行测试。

最佳答案

在对性能分析进行更多探索后,我发现使用秒表并不是衡量特定任务性能的准确方法

(感谢 hatchet 和 Loren 对此的评论!)

秒表不准确的原因:

  1. 测量是以耗时(以毫秒为单位)计算的,而不是 CPU 时间。
  2. 测量可能会受到背景“噪音”和线程密集型进程的影响。
  3. 测量未考虑 JIT 编译和开销。

话虽如此,使用秒表可以随意探索性能。考虑到这一点,我稍微改进了我的分析算法。

在它简单地执行传递给它的表达式之前,它现在可以多次迭代表达式,建立平均执行时间。第一次运行可以省略,因为这是 JIT 发挥作用的地方,可能会产生一些主要的开销。可以理解,这永远不会像使用像 Redgate's ANTS profiler 这样的专业分析工具那么复杂。 ,但对于更简单的任务来说没问题!

关于c# - .NET 中的性能分析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12629032/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com