当我通过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秒。
是什么原因?
答案 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()
测量其他几个人的时间。