我刚刚开始学习各种算法,我正在尝试编写一个测试算法之间速度的程序,并输出每个算法运行到屏幕所需的时间。正如我所设置的那样,每个算法都是RunnableAlgorithm
抽象类的子类,它为算法的每次迭代创建相同参数的新数组。
然而,随着算法的每次迭代,它似乎运行得更快!这是输出的片段 - 我已经尝试了几次,并且它运行它的次数越来越快。
SelectionSort warmup .. 45695528 ns
SelectionSort: 996415 ns
SelectionSort: 1044200 ns
SelectionSort: 1260648 ns
SelectionSort: 774839 ns
SelectionSort: 738320 ns
SelectionSort: 337446 ns
它有一个在超类ctor中调用的“预热”方法(根据我的理解)应该加载所有使用的类。
预热会调用稍后调用的所有类,包括DecimalFormat,Random,System(用于System.nanoTime()
和System.out
),以及多次运行算法。
SelectionSort s = new SelectionSort();
for (int i = 0; i < 6; i++) {
s.setTime();
s.algorithmAverage();
s.printTime();
}
setTime()设置一个变量:
beginTime = System.nanoTime();
和printTime()是:
System.out.println(this.getClass().getName() + ": " + new
DecimalFormat(DECIMAL).format( System.nanoTime() - beginTime)
+ " ns");
和algorithmAverage()
运行算法10次,这是正在计时的。任何人都可以帮助我理解它加速的原因吗? JVM是否优化了要运行的代码,因为它经常被调用?有没有更好,更一致的方法来测试System.nanoTime()
以外的算法速度,这似乎是相当不可靠的?
先谢谢你!