为什么从Leiningen运行时,任何Java / Clojure程序都会放慢速度?

时间:2013-04-18 10:43:47

标签: clojure leiningen

在对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

我的运行时间约为 2s ! Clojure / Leiningen如何通过这么多来减缓完整的Java程序?我做错了什么?

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

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

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

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

3 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:1)

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

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

  • 调用哪些启动代码,这将影响JIT统计信息
  • 加载了哪些其他类(例如Random的其他子类)可能影响编译器方法调用分派的优化

答案 2 :(得分:-1)

莱宁根大约需要一秒钟才能开始。