为什么我的Java程序通过Eclipse运行速度比通过shell运行快4倍?

时间:2011-08-26 14:22:29

标签: eclipse shell ubuntu console runtime

当我通过Eclipse执行下面的简单代码示例时(版本3.5.2,在Ubuntu 10.04上,java版本“1.6.0_20” OpenJDK运行时环境(IcedTea6 1.9.9)(6b20-1.9.9-0ubuntu1~10.04.2) OpenJDK Server VM(build 19.0-b09,混合模式)),大约需要10秒。当我从我的shell执行它(使用相同的优先级和java版本)时,大约需要40秒。

for (int i = 0; i<1000*1000; i++) {
  System.out.println(Math.cos(i));
}

我还尝试了其他程序,在运行时和输出量方面各不相同:每个程序在shell中都要慢得多。这与执行顺序无关。对于输出很少的程序,Eclipse中的最小百分比差异为85秒,而shell中为145秒。

是什么原因?

4 个答案:

答案 0 :(得分:19)

这是因为你正在为你的终端计时。显示/滚动文本时,某些终端只是慢速慢。并且您的终端是线路缓冲的,而eclipse控制台可能有更多的缓冲 - 导致您的程序在打印的每一行之后都必须等待终端。

尝试将程序的输出重定向到文件或/ dev / null,并将其计时。

在我的系统上,这与你的小循环有点不同:

$ time java T
 --snip - 1M lines of output--

real    0m24.746s
user    0m2.403s
sys     0m1.597s

$ time java T >output

real    0m5.172s
user    0m2.800s
sys     0m2.707s

答案 1 :(得分:6)

因为到目前为止,您的程序花在输出上的时间最多,所以执行的总时间在很大程度上取决于系统调用所花费的时间。所以将它放在常规控制台上似乎比eclipse中的输出窗口慢得多,但这并不意味着,你的程序本身执行得更快。

只需将所有输出定位到文件中,您就不会再看到太多差异了。

答案 2 :(得分:4)

有两种可能性浮现在脑海中。首先,在Eclipse中,Java机制已经被激活了;也许从shell运行会产生大量的启动开销。尝试只计算循环本身(使用System.currentTimeMillis())。

其次,您的配置可能是从shell运行的Java已禁用JIT。这可能会大大减慢程序的速度。检查环境变量是否存在可能禁用JIT编译器的任何内容。

答案 3 :(得分:2)

你是如何衡量时间的?使用System.nanoTime()? (如果您在外部测量时间,请记住引导VM的时间。)

尝试执行以下操作:

  • 修改主要方法,先进行热身运行而不记录时间。
  • 然后使用System.nanoTime()测量其他几个人的时间。
  • 查看从控制台和Eclipse测量的平均时间之间的性能是否有任何显着差异。