【问题标题】:Why is any Java/Clojure program slowed down when run from Leiningen?为什么从 Leiningen 运行任何 Java/Clojure 程序都会变慢?
【发布时间】:2013-04-18 10:43:47
【问题描述】:

在对 Clojure 应用程序进行基准测试并试图确定性能问题时,我注意到了这种特殊行为:即使整个程序是用 Java 编写的,但从 Leiningen 启动时,它似乎会出现明显的减速。

假设我有这个 Java 程序:

public class Foo {
    public static void main(String[] args) throws Exception {
        for (int i = 0; i < 10; i++)
             run();
    }

    public static void run() {
        final long start = System.nanoTime();

        Random r = new Random();
        double x = 0;
        for(int i=0; i<50000000; i++)
            x += r.nextDouble();

        final long time = TimeUnit.MILLISECONDS.convert(System.nanoTime() - start, TimeUnit.NANOSECONDS);
        System.out.println("time (ms): " + time + " total: " + x);
    }
}

当我简单地运行程序时,我得到的执行时间(每个 run)大约为 1 秒。但是,当我像这样从 leiningen 运行它时:

lein run -m Foo

我的运行时间约为 2 秒! Clojure/Leiningen 是如何将一个完整的 Java 程序减慢这么多的?我做错了什么?

我尝试在两次运行中检查系统属性,但没有发现任何明显的东西(例如不同的 JIT 设置)。在这两种情况下,我都使用 Java 7 和服务器编译器。

编辑:我不知道为什么这个问题被否决了。我不反对 Clojure。相反,我喜欢 Clojure,我将使用它。我只是有一个我绝对必须解决的严重性能问题。

更新:运行lein trampoline 解决了这个问题! (虽然我不知道为什么) 我已更新问题以反映这确实是 Leiningen 问题,而不是 Clojure 问题。

另一个更新:任何 Clojure 代码也会发生这种情况。在没有蹦床的情况下运行会使代码速度降低多达 5 倍。

【问题讨论】:

  • 提示:lein help trampoline

标签: clojure leiningen


【解决方案1】:

leiningen 的创建者意识到了这一点,并详细解释了为什么会这样,以及你可以做些什么。

https://github.com/technomancy/leiningen/wiki/Faster

相关问题: Why is leiningen so slow when it starts?

【讨论】:

    【解决方案2】:

    这可能是由于不同的 JIT 行为造成的。

    JIT 编译的性能会受到许多因素的影响,包括:

    • 调用了哪些启动代码,这会影响 JIT 统计数据
    • 还加载了哪些其他类(例如 Random 的其他子类),这可能会影响编译器对方法调用调度的优化

    【讨论】:

    • 我都尝试过 -XX:+PrintCompilation。在这两种情况下 run() 都被编译(这里唯一有趣的函数)。不过,请参阅更新。不知何故,这是 leiningen 造成的。
    【解决方案3】:

    leiningen 启动大约需要一秒钟。

    【讨论】:

    • 显然,我没有计算 lein 的启动时间。看节目。我正在查看 run 方法中的时间安排。
    • 你是对的。我猜那里发生了一些奇怪的事情。你确定你在类路径上有同样的东西吗?
    • 另外:你可能有不同的内存限制,所以 lein 启动的程序可能需要做更多的垃圾收集。如果没有确切的设置/系统属性,这个问题很难诊断。
    • 程序运行时根本没有收集垃圾(通过-verbose:gc 验证)。为了收集垃圾,必须先创建它,我认为 Clojure/lein 不能以某种方式使算法产生更多垃圾。
    猜你喜欢
    • 1970-01-01
    • 2011-02-01
    • 1970-01-01
    • 2013-09-22
    • 1970-01-01
    • 2014-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多