为什么任何Java/Clojure程序在从Leiningen运行时都会慢下来?
在对Clojure应用程序进行基准测试并试图确定性能问题时,我注意到了这种奇怪的行为:即使整个程序都是用Java编写的,但从Leiningen启动时,它似乎经历了显著的减速 假设我有这个Java程序:为什么任何Java/Clojure程序在从Leiningen运行时都会慢下来?,clojure,leiningen,Clojure,Leiningen,在对Clojure应用程序进行基准测试并试图确定性能问题时,我注意到了这种奇怪的行为:即使整个程序都是用Java编写的,但从Leiningen启动时,它似乎经历了显著的减速 假设我有这个Java程序: 公共类Foo{ 公共静态void main(字符串[]args)引发异常{ 对于(int i=0;i
公共类Foo{
公共静态void main(字符串[]args)引发异常{
对于(int i=0;i<10;i++)
run();
}
公共静态无效运行(){
最终长启动=System.nanoTime();
随机r=新随机();
双x=0;
对于(int i=0;ileiningen,启动大约需要一秒钟。这可能是由于不同的JIT行为
JIT编译的性能可能受到许多因素的影响,包括:
- 调用什么启动代码,这将影响JIT统计信息
- 加载了哪些其他类(例如Random的其他子类),这些类可能会影响编译器优化方法调用调度
leiningen的创作者们意识到了这一点,并对为什么会这样以及你能做些什么做了透彻的解释
相关问题:
显然,我没有计算lein的启动时间。看看程序。我在看run方法中的计时。你是对的。我猜那里发生了一些奇怪的事情。你确定你在类路径上有相同的东西吗?另外:你可能有不同的内存限制,所以lein启动的程序可能需要做更多的垃圾处理正在选择。如果没有确切的设置/系统属性,则很难诊断该问题。在程序运行时,根本不会收集任何垃圾(通过
-verbose:gc
验证)。为了收集垃圾,必须首先创建垃圾,我不认为Clojure/lein会以某种方式使算法产生更多垃圾。我已经用-XX:+printcomilation尝试了这两种方法。在这两种情况下,都会编译run()(这里唯一有趣的函数)。但请参阅更新。不知何故,这是莱宁根造成的。提示:lein help trampoline
lein run -m Foo