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