怎么来同一个方法运行时间每次不同?

时间:2011-09-07 15:13:07

标签: c# java sorting groovy

这可能是适合所有编程语言的问题(我猜!)。我在Groovy中有这样的代码:

def a =['asd','sdf','sdr','asd','tty','gfdg','dfgt','rfgsf','rfas','asddre','asdfr','adsrf']
start = System.currentTimeMillis() 
println a.sort()
end = System.currentTimeMillis() 
println "Sort in-built is ${end-start}"
def InsertionSort(def b = [])
{
   for(out=1;out<b.size();out++)
    {
        temp = b[out]
        in1 = out;
        while(in1>0 && b[in1-1]>=temp)
        {
            b[in1] = b[in1-1]
            --in1
        }
        b[in1] = temp;
    }
    return b
}
start = System.currentTimeMillis() 
c = InsertionSort(a)
end = System.currentTimeMillis() 
println "Insertion Sort is ${end-start}"
println c

显然,上面的代码检查内置sort函数和名为InsertionSort的函数的运行时间,该函数与sort的作用相同。

现在我在不同的时间运行此相同的代码。假设我在下午8:34:33执行代码时输出为:

[adsrf, asd, asd, asddre, asdfr, dfgt, gfdg, rfas, rfgsf, sdf, sdr, tty]
Sort in-built is 4
Instertion sort is 6
[adsrf, asd, asd, asddre, asdfr, dfgt, gfdg, rfas, rfgsf, sdf, sdr, tty]

现在8:35:03当我执行相同的程序时,输出为:

[adsrf, asd, asd, asddre, asdfr, dfgt, gfdg, rfas, rfgsf, sdf, sdr, tty]
Sort in-built is 1
Insertion Sort is 1
[adsrf, asd, asd, asddre, asdfr, dfgt, gfdg, rfas, rfgsf, sdf, sdr, tty]

在几秒钟之后,我得到输出:

[adsrf, asd, asd, asddre, asdfr, dfgt, gfdg, rfas, rfgsf, sdf, sdr, tty]
Sort in-built is 0
Insertion Sort is 1
[adsrf, asd, asd, asddre, asdfr, dfgt, gfdg, rfas, rfgsf, sdf, sdr, tty]

您是否注意到每次执行程序时方法的运行时间都会发生变化?值得注意的是,从第一次执行和第二次执行开始,变化很大。那么这是否意味着Groovy将某个最新输出缓存到某个最小/秒?为什么每秒钟的变化呢?

提前致谢。

3 个答案:

答案 0 :(得分:8)

很多原因。

  1. 占用CPU时间的其他后台任务。
  2. 在使用JVM的语言中,JVM可以启用JIT并优化某些运行,尤其是在不重新启动JVM的情况下重复运行代码块时。

答案 1 :(得分:2)

  • 使用System.nanoTime()代替System.currentTimeMillis(),因为“值的粒度取决于底层操作系统”,并且不准确。
  • 您可以获得不同的运行时,因为还有许多其他进程在争夺CPU资源。
  • Java VM的运行时优化(JIT,循环展开或..)

答案 2 :(得分:2)

有很多方面会影响运行时。有关列表,请参阅Create quick/reliable benchmark with java?

因此,您应该使用微基准测试工具,尽可能地应对这些方面。例如,请参阅此列表:What is the best macro-benchmarking tool / framework to measure a single-threaded complex algorithm in Java?

我现在还不够了解Groovy是否也通过缓存等引入了一些时差。