gpt4 book ai didi

c# - 如何在c#中捕获准确的执行时间

转载 作者:行者123 更新时间:2023-12-02 15:56:51 25 4
gpt4 key购买 nike

我 try catch 函数的确切执行时间

Stopwatch regularSW = new Stopwatch();
for (int i = 0; i < 10; i++) {
regularSW.Start();
//function();
regularSW.Stop();

Console.WriteLine("Measured time: " + regularSW.Elapsed);
}

我还尝试了 DateTimeProcess.GetCurrentProcess().TotalProcessorTime但每次我都会得到不同的值。

我如何才能获得相同的值?

最佳答案

使用StopWatch,您已经使用了最准确的方法。但你并没有在循环中重新启动它。它始终从结束处的值开始。您必须创建一个新的 StopWatch 或调用 StopWatch.Restart而不是开始:

Stopwatch regularSW = new Stopwatch();
for (int i = 0; i < 10; i++) {
regularSW.Restart();
//function();
regularSW.Stop();
Console.WriteLine("Measured time: " + regularSW.Elapsed);
}

这就是值不同的原因。如果您现在仍然得到不同的值,那么原因是方法 function 确实具有不同的执行时间,这并非不可能(例如,如果它是数据库查询)。


由于这个问题似乎很大程度上是理论性的(关于您的评论),如果您想测量 .NET 中的时间,请考虑以下事项:

  • 在 Release模式、任何 CPU(x64 计算机上)和优化下编译和运行
  • 一个刻度为 0.0001 毫秒,因此不要高估您的结果
  • 它们是不同的,因为您无法控制 C# 程序运行时系统可能需要在后台执行哪些其他操作
  • 例如,如果您因填充本地列表而在方法中声明内存,则垃圾收集器可能会尝试回收垃圾(内存)
  • C# 代码是即时编译的。因此,由于分析循环调用的代码的抖动成本,第一次执行循环的成本可能比后续每次执行的成本高数百或数千倍。如果您打算测量循环的“热”成本,那么您需要在开始计时之前运行一次循环。如果您打算测量包括 jit 时间在内的平均成本,那么您需要确定合理的试验次数,以便正确计算平均值
  • 您正在多线程、多处理器环境中运行代码,其中线程可以随意切换,并且线程量程(操作系统为另一个线程提供的时间量,直到您的线程有机会再次运行)为大约16毫秒。 16 毫秒大约是 5000 万个处理器周期。如果线程切换发生在您尝试测量的数百万个处理器周期之一内,那么获得亚毫秒级操作的准确计时可能会非常困难。考虑到这一点。

最后两点复制自 this answer of Eric Lippert (值得一读)。

关于c# - 如何在c#中捕获准确的执行时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29141681/

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