过时的Java优化技巧

问题描述 投票:42回答:8

[Java编译器,尤其是Profile-guided optimization已淘汰了许多性能技巧。例如,这些平台提供的优化可以极大地(根据消息来源)降低虚拟函数调用的成本。 VM还能够进行方法内联,循环展开等。

您还采用了哪些其他性能优化技术,但是实际上在更现代的JVM中发现的优化机制已使这些技术过时了。

java performance optimization
8个回答
23
投票

方法和方法参数的最终修饰符根本无法提高性能。

此外,Java HotSpot wiki很好地概述了HotSpot使用的优化以及如何在Java代码中有效使用它们。


20
投票

人们用多个对StringBuilder或StringBuffer的调用替换String a = "this" + var1 + " is " + var2;。实际上,它已经在后台使用StringBuilder。


16
投票

在开始性能优化之前,必须定义时间/内存的取舍。这就是我为内存/时间紧迫的应用程序执行的操作(请完整重复上述一些答案,以完成操作):

  1. 规则1永远不要在开发的早期阶段进行性能优化。如果您确实不需要,请不要这样做。如果决定这样做,则:
  2. 使用分析器查找瓶颈,查看源代码以查找瓶颈的原因;
  3. 选择最适合定义的时间/内存权衡的数据结构;
  4. 选择合适的算法(例如迭代与递归等);
  5. 如果真的不需要,请避免使用Java库中的同步对象;
  6. 避免显式/隐式地创建新对象;
  7. 仅当您确定它们不符合您的要求时,才随Java一起改写/重新实现数据类型/算法。
  8. 使用小型独立测试来测试所选算法/数据结构的性能。

8
投票

[2001年,我为J2ME手机制作了应用程序。那是一块砖头的大小。而且几乎具有砖的计算能力。

要使Java应用程序在其上可接受地运行,需要以程序方式编写它们。此外,非常大的性能改进是捕获ArrayIndexOutOfBoundsException以退出向量中所有项目的for循环。考虑一下!

甚至在Android上,数组中的所有项目都有“快速”循环,而编写相同内容的方式则是“缓慢”的编写方式,如dalvik VM内部的Google IO视频中所述。

但是,在回答您的问题时,我会说,如今对这种事情进行微优化是很不寻常的,我还希望在JIT VM(甚至是新的Android 2.2 VM,这些增加了JIT)这些优化是没有意义的。在2001年,该电话以33MHz的频率运行KVM解释器。现在,它以500MHz至1500MHz的速度运行dalvik(比KVM快得多的VM),并具有L1 e.t.c更快的ARM体系结构(更好的处理器甚至允许增加时钟速度)。准时到达。

我们还不适应使用Java在电话或台式机上使用i7进行直接像素操作的领域,因此仍然存在正常的日常代码,Java不够快对于。声称专家的Here's an interesting blog表示,对​​于某些繁重的CPU任务,Java的速度是C ++的80%;我很怀疑,我写了图像处理代码,并且看到Java和本机之间的像素循环有一个数量级。也许我缺少一些窍门...? :D


4
投票
  1. 不要手动调用垃圾收集器,它会损害现代JVM实现的性能。
  2. 整数而不是Long不会节省太多空间,但是会限制数字的范围。
  3. 避免手动生成Enum类,而使用内置的Enum。 Java 1.5引入了真正的枚举,请使用它们。

2
投票

当使用RAM小于32GB的x64 JVM时]:

64位JVM比32位JVM多使用30%-50%的内存,因为更大的普通对象指针。您可以使用JDK6 +大大降低这一因素。

从JDK6u6p到JDK6u22,它是可选的,可以通过添加JVM参数来启用:

-XX:+UseCompressedOops 

从JDK6u23(也为JDK7)开始,默认情况下启用。更多信息here


1
投票
  1. “过早的优化是万恶之源”(Donald Knuth)

0
投票

我发现上面的链接已经过时。这是有关Java优化的新内容:http://www.appperfect.com/support/java-coding-rules/optimization.html

© www.soinside.com 2019 - 2024. All rights reserved.