首先,我应该提到,我知道性能优化可能是非常特定于项目的。我现在基本上没有面临这些特殊问题。我面临着 JVM 本身的一系列性能问题。
我现在想知道:
- 哪些代码优化有意义 从编译器的角度来看: 支持垃圾的例子 收集器我将变量声明为 最终 - 非常遵循PMD 来自 Eclipse 的建议。
- 有哪些最佳实践:vmargs、 堆和其他东西传递给 JVM 用于初始化。如何得到 这里的值(value)观正确吗?有没有 公式还是尝试错误?
Java 实现了很多自动化,在字节码级别和其他方面做了很多优化。然而我认为其中大部分必须由开发人员计划才能发挥作用。
那么如何加速 Java 程序呢? :)
最佳答案
Which code-optimization make sense from a compiler perspective: for example to support the garbage collector I declared variables as final - very much following PMD's suggestions here from Eclipse.
假设您正在谈论可以对代码进行潜在的微观优化,那么答案几乎是否定的。提高应用程序性能的最佳方法是运行分析器来找出性能瓶颈所在,然后找出是否可以采取任何措施来加快速度。
在大多数情况下,所有经典技巧(例如将类、变量和方法声明为 Final、重新组织循环、更改基本类型)几乎都是浪费精力。 JIT 编译器通常可以比您做得更好。例如,最近的 JIT 编译器将分析所有加载的类,以确定哪些方法调用不会受到重载,而无需将类或方法声明为 final
。然后它将使用更快的调用序列,甚至内联方法主体。
事实上,Sun 专家表示,一些程序员的优化尝试失败了,因为它们实际上使 JIT 编译器更难应用它所了解的优化。
另一方面,更高级别的算法优化绝对是值得的......只要您的分析器告诉您您的应用程序在该代码区域花费了大量时间。
在异常情况下,使用数组而不是集合可能是一种值得优化的方法,在极少数情况下,使用对象池也可能是一种值得优化的方法。但这些优化 1) 会使您的代码更加复杂且容易出现错误,2) 如果使用不当,可能会减慢您的应用程序速度。这些类型的优化只能作为最后的手段来尝试。例如,如果您的分析显示某某 HashMap<Integer,Integer>
是 CPU 瓶颈还是内存占用过多,那么最好寻找现有的专用 Map
或Map
- 类似库类,而不是尝试使用数组自己实现 map 。换句话说,在高层进行优化。
如果您花费的时间足够长或者您的应用程序足够小,那么仔细的微优化可能会给您带来比仅仅依赖 JIT 编译器更快的应用程序(在给定的 JVM 版本/硬件平台上)。如果您正在使用 Java 实现一个小型应用程序来进行大规模数字运算,那么微优化的返回可能会非常可观。但这显然不是典型案例!对于典型的 Java 应用程序,工作量足够大,而性能差异足够小,因此微优化是不值得的。
(顺便说一句,我不明白声明一个变量会对 GC 性能产生任何可能的影响。每次遇到变量时,GC 都必须跟踪它,无论它是否是最终的。此外,这是一个公开的 secret 最终变量在某些情况下实际上可以改变,因此 GC 假设它们不会改变是不安全的。不安全就像“创建一个悬空指针导致 JVM 崩溃”。)
关于java - 通过代码实现 Java 性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3226149/