【问题标题】:Running time of the same statement differs so much in JavaJava中相同语句的运行时间差异很大
【发布时间】:2014-03-06 01:31:51
【问题描述】:

我只是在 java 中编写了一个程序来测试执行 myQsort 所花费的时间。
部分代码如下所示:

long t1 = System.currentTimeMillis();
new sort().myQsort(a, 0, 100000 - 1);
long t2 = System.currentTimeMillis();


我将语句循环五次以获得五次 timeSpent (t2-t1) 并将它们打印出来,但结果很奇怪,每次第一次 timeSpent 都比其他时间大


Java 中的快速排序:
第一轮:30毫秒
第二轮:9毫秒
第三轮:9毫秒
第四轮:11毫秒
第 5 轮:9 毫秒
平均花费时间:13 毫秒


我尝试以不同的顺序读取 5 个输入文件,甚至读取同一个文件 5 次。但结果都是相似的。我还尝试在另一台计算机上运行代码,但结果仍然相同。

谁能解释为什么会这样?


问题已解决 感谢所有答案,我尝试将 -Xint 添加到 VM 设置中(以关闭 JIT),这次一切正常。


Java 中的快速排序:
第一轮:61毫秒
第二轮:68毫秒
第三轮:72毫秒
第四轮:73毫秒
第 5 轮:59 毫秒
平均花费时间:66 毫秒


再次感谢您的所有回答,这对您有很大帮助:)

【问题讨论】:

  • 我认为主要原因是 Java JIT 编译器
  • 垃圾收集、JIT、系统/操作系统开销...
  • 第一次运行,这是冷启动,意味着Java第一次加载到代码中。第二次它已经在内存中了。如您所见,第一次之后时间变化不大。

标签: java time


【解决方案1】:

第一次运行,这是冷启动,意味着Java第一次加载程序的代码和自己的代码。

第二次它已经在内存中了。如您所见,第一次之后时间变化不大。

此外,毫秒数可能因发生的事件而异。例如通过网络发送给你的东西,你的操作系统需要修改一个重要的表,等等。

【讨论】:

  • 得到它,我已经尝试关闭 JIT,这一次每次都一样 :)
【解决方案2】:

除了 JIT 编译之外,另一个因素可能是要排序的列表的状态。 就像快速排序在列表已经排序的情况下表现最差一样,如果列表已经排序,您的排序算法可能表现最好。

因此,您可能需要确保您的排序算法没有改变列表的状态,或者您需要在开始测试之前复制您的列表。

【讨论】:

  • 我假设这些是单独的运行(具有相同的输入数据或随机生成的数据)。
  • 问题中提到他/她“循环语句五次”。所以,我认为这也可能是一个可能的原因。
  • 其实我是在每个循环中单独读取文件,并没有对原始副本做任何更改,所以列表的状态没有改变...我会尝试关闭JIT看看是否结果改变
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-26
  • 2013-09-30
  • 1970-01-01
  • 1970-01-01
  • 2013-09-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多