在对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倍。
答案 0 :(得分:3)
莱宁根的创造者意识到了这一点,并详细解释了为什么会这样,以及你可以做些什么。
答案 1 :(得分:1)
这可能是由于不同的JIT行为造成的。
编译的JIT的性能可能会受到许多因素的影响,包括:
答案 2 :(得分:-1)