许多与Java性能有关的技巧已经被Java编译器和尤其是Profile-guided optimization所淘汰。例如,这些由平台提供的优化措施可以大幅度(根据来源)降低虚函数调用的成本。VM 还能够进行方法内联、循环展开等操作。
除了上述方法之外,还有哪些性能优化技术您遇到过,但实际上已经被更现代的JVM优化机制所淘汰了呢?
许多与Java性能有关的技巧已经被Java编译器和尤其是Profile-guided optimization所淘汰。例如,这些由平台提供的优化措施可以大幅度(根据来源)降低虚函数调用的成本。VM 还能够进行方法内联、循环展开等操作。
除了上述方法之外,还有哪些性能优化技术您遇到过,但实际上已经被更现代的JVM优化机制所淘汰了呢?
在方法和方法参数上使用的final修饰符并不会对性能产生任何帮助。
此外,Java HotSpot wiki提供了有关HotSpot使用的优化以及如何在Java代码中有效使用它们的良好概述。
final
修饰符不会向JIT提供任何信息。然而,方法参数上的final
修饰符可能会提供有用的优化提示(类似于声明为final
的局部变量)。但最终使用final
的原因是为了强制不可变性-这是设计时的特征,使代码更易于维护。任何优化收益都需要考虑以下问题:a)只有在实际存在性能问题时才会关注它,b)需要进行详尽的测试以确保它确实有所改进。 - Kevin Dayfinal
通常不会有任何区别(编译器确实可以看到你是否对其进行赋值,而 Java 不通过引用传递变量 - 对象通过引用传递,但持有它们的变量不是)。但是,这意味着该参数可以与内部类或匿名类一起使用。如果有意义,请使用它,否则不要使用。 - Donal Fellows有人用多个StringBuilder或StringBuffer调用替换String a = "this" + var1 + " is " + var2;
,但实际上Java编译器已经在幕后使用了StringBuilder。
String a = new StringBuilder("this").append(var1).append("is").append(var2).toString();
的操作? - Paul TomblinString a = "this" + var1; a += " is " + var2;
替换为StringBuilder仍然是有效的。(至少在我最后一次检查时是这样的 :-/) - Devon_C_Miller在开始性能优化之前,有必要定义时间/内存折衷。以下是我为我的内存/时间关键应用程序执行此操作的方式(重复了一些以上的答案,以保证完整):
2001年,我为一款J2ME手机开发了应用程序。它的大小像一块砖头,计算能力也几乎如同砖头。
要让Java应用程序在这款手机上运行得足够流畅,需要尽可能以过程化方式编写代码。此外,最大的性能提升是通过捕获ArrayIndexOutOfBoundsException
来退出循环,以遍历向量中的所有项。想想看!
即使在Android上,也有“快速”循环遍历数组中的所有项和“缓慢”的编写相同内容的方式,正如在Google IO视频中提到的dalvik VM内部。
然而,针对你的问题,我认为这种微观优化方式在当今已经非常不寻常了,并且我进一步预计,在JIT VM(甚至是新增JIT的Android 2.2 VM)上,这些优化已经没有意义了。2001年,该手机以33MHz的速度运行KVM解释器。现在,它以500MHz至1500MHz的速度运行dalvik——比KVM快得多的VM——采用更快的ARM架构(即使考虑时钟速度增益也更好),并具有L1等特性,同时还引入了JIT技术。
我们还没有到可以放心在Java中进行直接的像素操作的领域——无论是在手机上还是在i7桌面上——因此仍然存在一些日常代码,Java的速度不够快。 这里有一个有趣的博客,声称一位专家表示,在某些重型CPU任务方面,Java的速度达到了C++速度的80%;我持怀疑态度,因为我编写图像处理代码时,发现Java和本地代码在遍历像素时相差了一个数量级。也许我错过了什么技巧……? :D
当使用小于32GB RAM的x64 JVM时:
与32位JVM相比,64位JVM由于较大的普通对象指针而使用30%-50%更多的内存。您可以通过使用JDK6+来大幅减少此因素。
从JDK6u6p到JDK6u22,它是可选的,并且可以通过添加JVM参数来启用:
-XX:+UseCompressedOops
从JDK6u23开始(JDK7同样如此),它已默认启用。更多信息在这里。
我发现上面的链接已经过时了。这里有一个关于Java优化的新链接:http://www.appperfect.com/support/java-coding-rules/optimization.html