C#为啥一个方法的运行时间不一样?

Posted

技术标签:

【中文标题】C#为啥一个方法的运行时间不一样?【英文标题】:C# Why the running time of a method is not the same?C#为什么一个方法的运行时间不一样? 【发布时间】:2012-03-22 12:27:37 【问题描述】:

如果我测量一个方法的运行时间,如果我给出相同的输入数据,它不应该是一样的吗? 我使用了秒表:

Stopwatch sw = new Stopwatch();
sw.Start();
//code here
sw.Stop();
label3.Text = "Running Time:"+sw.Elapsed.TotalMilliseconds;

【问题讨论】:

好吧,它不会完全一样,但应该很接近,假设其他一切都一样! 进程的滴答数应该相同..不是时间..你不是唯一使用cpu的人..还有一个缓存有时会有所帮助...... 【参考方案1】:

没有代码很难分辨。

由于多种原因,您可能会看到差异 - 这绝不是一个完整的列表:

    计算机正忙 - 您的计算机正在执行其他操作,这意味着它为您的代码提供的资源(CPU 时间)更少。 I/O - 您执行某种 I/O 可能需要一段时间或很长时间。 Jitting - 第一次运行方法时,JIT 编译器会编译它,这需要时间。第二次所需的时间要少得多。 缓存命中和未命中 - 如果您测量相同的代码两次,第二次可能会更快,因为代码使用的数据已经在缓存中。

【讨论】:

【参考方案2】:

不,一点也不。你的程序在一个复杂的系统上运行——一台计算机——它运行着许多其他进程,在奇怪的时刻中断你的程序以借用 CPU。即使在您的程序中,也有其他线程可能会在这里和那里窃取循环。基准总是必须是统计的——多次测量,然后取平均值。

【讨论】:

【参考方案3】:

没有。

涉及时间的因素很多:

正在运行的其他进程 可用资源 在您的进程中运行的其他线程争夺相同的资源 如果 GC 在运行方法时启动 您机器的硬件 ....

【讨论】:

【参考方案4】:

不,因为您计算机上的其他程序也在使用 CPU。因此,即使代码相同,您计算机上的环境也可能会发生变化。可能是大量的网络流量、一些后台任务等等。

【讨论】:

好的,但我必须在图表中绘制 10 个输入和它们对应的运行时间,以证明该算法是指数运行时间。我应该使用什么值?我随便挑一个? 最好的办法是对每个输入大小运行几百次并平均结果。然后对每个输入大小重复。【参考方案5】:

从不可能完全相同相同。总会有变化。在您的计算机上运行的不仅是您的程序,还有操作系统和其他程序、服务。

重要的是不要看到次之间的大差异。就是这样。

【讨论】:

【参考方案6】:

代码和计算机上都发生了很多事情。你会很幸运每次都能得到相同的结果。

【讨论】:

【参考方案7】:

这取决于您的处理器上当前运行的进程数。如果您的处理器负载很重,那么我可能会花费一些时间。但不会有太大区别。

【讨论】:

【参考方案8】:

不,因为您的计算机上正在运行其他几个事件,这些事件会影响您的秒表时间。

只是一个小清单:

您计算机上的另一个进程需要 CPU 时间和您的 进程/线程不如这个进程重要 与所有硬件调用相同,例如写入硬盘驱动器、绘制图形等 您是第一次调用此方法/类,JIT-Compiler 在执行之前运行 您的堆已用完,您的应用程序需要新的内存,否则垃圾收集器将收集并释放所有过时的数据 您的处理器开始降低功耗并以较低的速率运行 还有更多更多更多...

由于所有这些影响,通常使用相同的方法、相同的参数在循环中多次调用这种性能比较。

【讨论】:

以上是关于C#为啥一个方法的运行时间不一样?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Castle Windsor 拦截器会破坏 C# 动态对象上方法的运行时绑定?

C# 异步方法加await调用不就变成同步方法了吗

在 C# 中或手动运行 cmdline 命令 - 结果不一样

为啥相同的SOFM程序每次运行的结果不一样

C# - 为啥全屏 Winform 应用程序不总是覆盖任务栏?

c#在vs2010调试运行和在debug中运行exe文件 结果不一样(串口通信)