如何编写高效的Java代码?

时间:2009-06-03 09:48:11

标签: java optimization compiler-construction jvm

正如大家所知,Java代码是由JVM编译和解释的。 我的问题涉及优化: 它是仅在运行时由JVM优化还是在编译时优化?

为了编写有效的代码,我在哪里可以找到支持的优化列表? 或者JVM优化是否足够强大,以便我只需编写可读且易于维护的代码,而不管速度性能如何?

7 个答案:

答案 0 :(得分:31)

大多数优化都是由JVM完成的。 JIT级别的优化通常比编译时更多。 (“优化”标志实际上取自javac,因为事实证明某些“优化”实际上损害了现实世界中的表现。)

一般而言(这适用于许多语言/平台,而不仅仅是Java):

  • 编写尽可能可读和可维护的代码。
  • 拥有绩效目标和基准,以便始终衡量绩效
  • 努力使架构表现出色;之后很难改变(与改变实施相比)
  • 在算法的复杂性方面考虑性能比“使其快10%”:从O(n ^ 2)到O(n)的变化(通常)更为重要。 (这在很大程度上取决于现实世界的使用情况 - 如果你只是处理n的小值,那么“理论上更好”的算法很容易因为常数因素而变慢。)
  • 使用分析器确定瓶颈在哪里
  • 只有在分析器表明值得做的时候才会以可读性为代价进行微观优化
  • 在这样的优化之后进行测量 - 实际上你可能没有太大影响,在这种情况下回滚

答案 1 :(得分:5)

Java HotSpot JIT编译器可以检测“热点”并自适应地修改执行代码,从而提供更好的性能。阅读它here

另一方面,如果你想编写一个有效的代码,请阅读Robert Simmons的“Hardcore Java”或Brian Goetz的“Java Concurrency in Practice”等书。

答案 2 :(得分:4)

我绝对会选择编写代码来实现可读性和可维护性。

过早优化通常被视为一件坏事。 http://en.wikipedia.org/wiki/Optimization_(computer_science)#When_to_optimize

当然,使用性能分析工具测量和证明瓶颈是另一回事。 如果您这样做并且可以证明有些领域需要优化,那么您可以继续测量其优势并进行优化。

答案 3 :(得分:3)

  

是否在JVM的运行时进行了优化   只在编译时还是在编译时?

Java编译器通常只进行很少的优化(除了解析复合文字),因为“优化的”字节码可能会妨碍JIT编译器优化的能力 - 而这正是它真正重要的地方。

  

或者JVM优化功能强大   足以让我只需要写   代码易读且易于使用   无论速度如何都要保持   性能

这不是一个信任JVM来比你更好地优化的问题(尽管这绝对是一个因素),因为代码不经常执行,所以优化的问题在95%的时间完全无关紧要。如果一段代码占应用程序执行时间的0.1%,则根本不值得花时间。即使你可以加速100次,它也不会让你获益。这是最常见的情况。

只要你避免公然愚蠢的事情,你就应该忘记优化,直到遇到具体的性能问题,然后才能完全优化探查器告诉你的代码片段。

答案 4 :(得分:1)

虽然这些提示适用于Google Android的特定Java实现,但我猜these Google Android performance tips也适用于“普通”JVM。请注意,就我所知,Android的Java在运行时并不优化代码。

答案 5 :(得分:0)

不要担心特定的JVM优化。这些细节从版本变为版本。

从Josh Bloch购买“Effective Java”一书 - 这是关于这个主题的最好的书。

答案 6 :(得分:-1)

JVM优化从版本变为版本。