gpt4 book ai didi

c# - 在 C# 中对小代码示例进行基准测试,可以改进此实现吗?

转载 作者:IT王子 更新时间:2023-10-29 03:35:22 24 4
gpt4 key购买 nike

在 SO 上,我经常发现自己对小块代码进行基准测试,以查看哪种实现速度最快。

我经常看到评论说基准测试代码没有考虑 jitting 或垃圾收集器。

我有以下我慢慢发展的简单基准测试功能:

  static void Profile(string description, int iterations, Action func) {
// warm up
func();
// clean up
GC.Collect();

var watch = new Stopwatch();
watch.Start();
for (int i = 0; i < iterations; i++) {
func();
}
watch.Stop();
Console.Write(description);
Console.WriteLine(" Time Elapsed {0} ms", watch.ElapsedMilliseconds);
}

用法:

Profile("a descriptions", how_many_iterations_to_run, () =>
{
// ... code being profiled
});

这个实现有什么缺陷吗?是否足以证明实现 X 在 Z 迭代中比实现 Y 更快?你能想出任何改进方法吗?

编辑很明显,基于时间的方法(而不是迭代)是首选,有没有人有任何时间检查不影响性能的实现?

最佳答案

这里是修改后的功能:根据社区的推荐,随时修改这个它是一个社区维基。

static double Profile(string description, int iterations, Action func) {
//Run at highest priority to minimize fluctuations caused by other processes/threads
Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.High;
Thread.CurrentThread.Priority = ThreadPriority.Highest;

// warm up
func();

var watch = new Stopwatch();

// clean up
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();

watch.Start();
for (int i = 0; i < iterations; i++) {
func();
}
watch.Stop();
Console.Write(description);
Console.WriteLine(" Time Elapsed {0} ms", watch.Elapsed.TotalMilliseconds);
return watch.Elapsed.TotalMilliseconds;
}

确保您在启用优化的 Release 中编译,并在 Visual Studio 之外运行测试。最后一部分很重要,因为 JIT 会在附加调试器的情况下限制其优化,即使在 Release模式下也是如此。

关于c# - 在 C# 中对小代码示例进行基准测试,可以改进此实现吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1047218/

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