在命令行中执行Java比在IntelliJ中执行慢

3

我写了一个简单的阶乘程序,具备任意精度:

public class Fac {
    public static void main(String[] args) {
        int stop = 100000;

        long start = System.currentTimeMillis();
        BigInteger integer = new BigInteger("1");
        for(int i = 2; i <= stop; i++){
            integer = integer.multiply(new BigInteger(i +""));
        }

        System.out.println("It took: " + (System.currentTimeMillis() - start) + "ms");
        //System.out.println(integer);
    }
}

当我在IntelliJ中运行它时:
It took: 5392ms

当我在命令行中运行它:

It took: 17919ms

命令行由以下方式运行:
javac Fac.java
java Fac

我知道这不是衡量时间的最佳方式,但差距如此之大以至于并不重要。为什么性能会有如此大的差异呢?

其他人也注意到了类似的差异,然而据我所知,他们的结论似乎与我的情况无关。

为什么在IntelliJ中运行应用程序比在命令行中运行更快?

为什么在IntelliJ IDEA中运行速度比Windows命令行快?


IntelliJ和cmd命令行都在同一个JRE上运行吗? - TheLostMind
IntelliJ有自己的编译器吗,就像Eclipse一样? - Kayaman
@TheLostMind 差不多。IntelliJ使用的是1.8.0_11 SDK,其中包含一个jre。命令行使用的是1.8.0_25 jre,但编译器仍然是1.8.0_11。 - Bjerrum
@Bjerrum - 哦,我不用 IntelliJ。无论如何,我猜 Vikingsteve 已经回答了你的问题 :) - TheLostMind
1个回答

5

这是因为你使用不同的类路径、参数等来启动 JVM 运行程序。

如果你在 IntelliJ 中运行程序,你会在 Run 窗口的第一行看到类似于 "C:\Program ..." 的内容。

点击展开它,你将看到 IntelliJ 运行你的程序时使用的所有参数(这里我将一个示例拆分成了多行)。

"C:\Program Files (x86)\Java\jdk1.8.0_40\bin\java"
-Didea.launcher.port=7532
 "-Didea.launcher.bin.path=C:\Program Files (x86)\JetBrains\IntelliJ IDEA 14.0.3\bin"
-Dfile.encoding=UTF-8
-classpath "C:\Program Files (x86)\Java\jdk1.8.0_40\jre\lib\charsets.jar;...etc..."
Fac

如果你使用完全相同的参数(使用完全相同的jvm),那么当你手动运行应用程序时,你很可能会看到类似的性能。
如果您没有完全指定它们,系统设置中的"PATH"、"JAVA_HOME"和"CLASSPATH"将默认用于启动您的程序。

谢谢。如果可以的话,我会点赞的。我在哪里可以获得关于这个神奇的洞察? - Bjerrum
在这里找到一个链接:http://www.ntu.edu.sg/home/ehchua/programming/howto/Environment_Variables.html - vikingsteve

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接