【问题标题】:Why is my Java program running 4 times faster via Eclipse than via shell?为什么我的 Java 程序通过 Eclipse 运行速度比通过 shell 快 4 倍?
【发布时间】:2011-11-04 14:07:15
【问题描述】:

当我通过 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 秒。

什么原因?

【问题讨论】:

  • 我认为 Eclipse 使用的是已经运行的 JVM,而当您手动运行 java 时,它必须启动一个。
  • 您确定您的控制台调用的 JDK 是 OpenJDK Server VM(内部版本 19.0-b09,混合模式)吗?尝试在 Eclipse 打开的情况下运行 shell 版本并运行一些空闲测试,以查看已经启动 JVM 的事实是否会影响 @Jeremy Heiler 明智地建议的行为。
  • 可能是打印到控制台的速度很慢,特别是如果您使用的是 GNOME 3 或 Unity 等合成桌面?尝试将输出重定向到文件,然后重新测试两者。
  • 请参阅stackoverflow.com/questions/7124489/… 了解非常相似的问题和可能的答案。
  • 哈哈@Hircus,一种行为,多种可能性;)

标签: eclipse shell ubuntu console runtime


【解决方案1】:

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

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

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

$ 时间 java T --snip - 1M 行输出-- 真正的 0m24.746s 用户 0m2.403s 系统 0m1.597s $ time java T >输出 真实0m5.172s 用户 0m2.800s 系统 0m2.707s

【讨论】:

  • 哇,我的终端速度很慢。我确实怀疑输出,因此在我的实验中减少了它,但并没有完全避免它(因此不会发生死代码消除)。我不相信偶尔的输出会产生如此巨大的影响,所以我没有进一步调查。重定向输出后:不再有时差。
【解决方案2】:

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

只需将所有输出导入到一个文件中,您就不会再看到太大的不同了。

【讨论】:

    【解决方案3】:

    我想到了两种可能性。首先,在 Eclipse 中,Java 机器已经启动;也许从 shell 运行会导致大量的启动开销。尝试仅对循环本身计时(使用System.currentTimeMillis())。

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

    【讨论】:

    • 我也做了一些带有微基准(执行时间测量库)的样本,它显示出同样的减速。
    • 我在我的 shell 环境中找不到任何相关的东西。其他地方可能隐藏了一些配置吗?嗯,当我通过一个选项停用 JIT 时,我将检查我的 java 程序是否运行得更慢......
    • JIT 处于活动状态,Eclipse 的控制台比 shell 的快得多(+5 到 nos 和 Geziefer)。
    • 是的,我看到 nos 和 Geziefer 想通了。干得好!
    【解决方案4】:

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

    尝试执行以下操作:

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

    【讨论】:

    • +5 为您的最后建议。没想到 shell 比 Eclipse 的控制台慢得多:-0
    猜你喜欢
    • 2014-02-09
    • 2017-02-03
    • 1970-01-01
    • 2023-02-16
    • 2012-06-10
    • 1970-01-01
    • 2012-12-12
    • 2018-08-14
    • 2015-10-27
    相关资源
    最近更新 更多