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# 中或手动运行 cmdline 命令 - 结果不一样