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

pro*_*ron 6 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 Code Online (Sandbox Code Playgroud)

当我只运行程序时,我的执行时间(每个run)约为1秒.但是,当我从leiningen那样运行它时:

lein run -m Foo
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

另一个更新:这也适用于任何Clojure代码.不使用蹦床运行会使代码速度降低5倍.

Joo*_*aat -1

leiningen 大约需要一秒钟才能启动。