使用Collections.emptyList()或空的ArrayList之间是否存在性能差异,尤其是在使用JIT编译器时?我可以想象-例如-JIT编译器不会执行内联或静态方法调用,因为执行的方法取决于类型。编辑我知道Collections.emptyList()返回一个不可变列表,而ArrayList是可变对象。我的意思是,如果我将一个或另一个作为参数传递给方法并且该方法不修改列表,是否会限制JIT编译器优化该方法的可能性?一个简单的例子(只是为了阐明我的意思):intsum(Listlist){intsum=0;for(inti=0;i如果我只使用ArrayList调用此方法,JI
随着时间的推移,Sun的JVM和JIT变得非常智能。不再需要过去作为必要的微优化而成为常识的事情,因为它会为您处理。例如,过去的情况是您应该将所有可能的类标记为最终类,以便JVM内联尽可能多的代码。但是现在,JIT会根据运行时加载的类来知道您的类是否是最终类,如果您加载一个类以使原始类成为非最终类,它会取消内联方法并将其取消标记为final。JVM或JIT还为您做了哪些其他智能微优化?编辑:我将其设为社区维基;我想随着时间的推移收集这些。 最佳答案 这太令人印象深刻了。所有这些都是您在C++中不能做的事情(当然在Java中做不到)。
我听说JIT会自动内联小方法,例如getter(它们大约有5个字节)。边界是什么?有没有JVM标志? 最佳答案 HotSpotJIT内联策略相当复杂。它涉及许多启发式方法,例如调用方方法大小、被调用方方法大小、IR节点计数、内联深度、调用计数、调用站点计数、抛出计数、方法签名等。访问器方法(getters/setters)和普通方法(字节码数少于6)跳过了一些限制。相关源码大部分在bytecodeInfo.cpp.请参阅InlineTree::try_to_inline、should_inline、should_not_inline
我有以下代码:privatefinalList>slaves;publicvoidupdateOrdering(){//removesvoidweakreferences//andensuresthatweakreferencesarenotvoided//duringsubsequentsortListunwrapped=unwrap();assertunwrapped.size()==this.slaves.size();//****couldbereimplementedwithoutusingunwrap()****Collections.sort(this.slaves,CM
我正在尝试基于方法结构和分析信息(由JVM提供)构建JIT策略,但我无法手动触发JIT。Thisdocumentation说我可以通过调用java.lang.Compiler.compileClass()来运行JIT,但是方法每次都返回false并且java.lang.Compiler检查的属性(java.compiler)每次我运行JVM时都是空的。我在OpenJDK和OracleJVM1.7上试过,结果都一样。但是当我用观察编译统计数据时$jstat-printcompilation我可以看到JIT成功编译了一些符合条件的方法。如果存在任何方式,我宁愿从Java代码中触发它。我试图
JIT的循环展开策略是什么?或者,如果没有简单的答案,那么有什么方法可以检查循环展开的位置/时间?GNodechild=null;for(inti=0;i基本上,我上面有一段代码具有静态迭代次数(8),当我按原样保留for循环时它会很糟糕。但是当我手动展开循环时,它的效果要好得多。我有兴趣了解JIT是否真的展开了循环,如果没有,那是为什么。 最佳答案 如果JVM展开循环,实际上最好回答printingthegeneratedassembly.请注意,这需要您的代码实际作为热点执行(即JVM认为它值得进行昂贵的优化)。为什么JVM决定
我听说是这种情况,但我找不到权威的在线资源来证实这一点。背景:一位同事喜欢将他的局部变量设为final。他这样做的原因之一是性能。我的观点是Java的HotSpotJustInTime编译器会自动检测不变的局部变量,并使它们成为final,因此我们自己这样做不会性能有任何好处。请注意,我不是询问将局部变量设为final是否是良好的编码习惯,因为已经有很多(离题的)SO问题了.编辑:mrhobo提出了关于优化整数文字字节码的一个很好的观点。我应该给出一个我正在谈论的代码类型的例子,以及我的问题:ObjectdoSomething(Foofoo){if(foo==null){returnn
我正在JVM上做一些性能测试,我想衡量内在函数使用的影响。我想在不进入解释模式的情况下为某些方法禁用内部函数的JIT使用。有没有办法做到这一点?谢谢 最佳答案 使用java-XX:+UnlockDiagnosticVMOptions-XX:DisableIntrinsic=_[,...]例如java-XX:+UnlockDiagnosticVMOptions-XX:DisableIntrinsic=_equals,_hashCode正如@apangin所注意到的,您可以首先使用-XX:+PrintIntrinsics来查看哪些方法实
我的问题如下:Java代码通常会像这样实现泛型集合:publicclassGenericCollection{privateObject[]data;publicGenericCollection(){//Backingarrayisaplainobjectarray.this.data=newObject[10];}@SuppressWarnings("unchecked")publicTget(intindex){//Andwejustcasttoappropriatetypewhenneeded.return(T)this.data[index];}}例如这样使用:for(MyO
受此启发question,我写了测试:publicclassMain{privatestaticfinallongTEST_NUMBERS=5L;privatestaticfinallongITERATION_NUMBER=100000L;privatestaticlongvalue;publicstaticvoidmain(finalString[]args)throwsThrowable{for(inti=0;i这个程序在普通情况下被打印出来:nonEqualsCount=12;//orothernon0value;nonEqualsCount=0;nonEqualsCount=0