wis*_*shi 2 java optimization performance
首先,我应该提一下,我知道性能优化可能非常符合项目.我现在大部分时间都没有遇到这些特殊问题.我面临着JVM本身的一系列性能问题.
我现在想知道:
Java自动化很多,在字节码级和内容上做了很多优化.但是我认为大部分内容必须由开发人员来规划才能工作.
那么如何加速Java程序呢?:)
从编译器的角度来看,哪种代码优化是有意义的:例如,为了支持垃圾收集器,我将变量声明为final - 非常依赖PMD的Eclipse建议.
假设您正在谈论可以对代码进行的潜在微优化,答案几乎都没有.提高应用程序性能的最佳方法是运行分析器以确定性能瓶颈的位置,然后确定是否可以采取任何措施来加速它们.
在大多数情况下,所有经典技巧如声明类,变量和方法final,重新组织循环,更改原始类型几乎都是浪费精力.JIT编译器通常可以做得比你做得好得多.例如,最近的JIT编译器将分析所有已加载的类,以确定哪些方法调用不会被重载,而无需将类或方法声明为final.然后它将使用更快的调用序列,甚至内联方法体.
实际上,Sun专家说,一些程序员尝试优化失败,因为它们实际上使JIT编译器更难以应用它所知道的优化.
另一方面,更高级别的算法优化绝对值得......只要您的分析器告诉您应用程序在代码的该区域花费了大量时间.
在不寻常的情况下使用数组而不是集合可能是值得优化的,并且在极少数情况下使用对象池也可能.但是这些优化1)会使您的代码更加复杂并且容易出错; 2)如果使用不当,可能会降低您的应用程序速度.这种优化只应作为最后的手段.例如,如果您的分析表明这样的等等HashMap<Integer,Integer>是CPU瓶颈或内存耗尽,那么寻找现有的专用Map或Map类似的库类比使用数组自己尝试和实现映射更好.换句话说,在高水平上进行优化.
如果您花费的时间足够长或者您的应用程序足够小,那么仔细的微优化可能会为您提供更快的应用程序(在给定的JVM版本/硬件平台上),而不仅仅依赖于JIT编译器.如果您正在实现一个小型应用程序来在Java中进行大规模数字运算,那么微优化的回报可能相当可观.但这显然不是典型案例!对于典型的Java应用程序,工作量足够大,性能差异足够小,以至于微优化不值得.
(顺便说一下,我没有看到声明变量如何对GC性能产生任何可能的差异.GC必须在每次遇到变量时跟踪变量是否是最终变量.此外,最终变量是一个公开的秘密.在某些情况下实际上可以改变,因此GC认为它们不会安全是不安全的.不安全,如"创建一个悬空指针导致JVM崩溃".)
我看到了很多.顺序通常是:
思考性能是关于编译器优化,big-O等等.
使用推荐的思想,大量的类,双向链表,带有向上,向下,向左和向右的指针的树,散列集,字典,调用其他属性的属性,调用其他事件处理程序的事件处理程序,XML编写来设计软件,解析,压缩和解压缩等.等
由于所有这些数据结构都像O(1)并且编译器正在优化其内容,因此应用程序应该"高效",对吧?那么,那个小小的声音告诉一个人说启动速度慢,关机速度慢,加载和卸载速度更快,为什么用户界面如此缓慢?
把它交给"性能专家".幸运的是,那个人发现,所有这些东西都是以推荐的方式完成的,但这就是为什么它会让人心动.它正在做所有这些事情,因为它是推荐的做事方式,而不是因为它是需要的.
幸运的是,人们有机会重新设计其中的一些东西,使其变得简单,并逐渐消除"瓶颈".我说,"运气好",因为通常它是不可能的,所以开发依赖于下一代更快的处理器来消除痛苦.
这种情况发生在每种语言中,但更多的是在Java,C#,C++中,抽象已经被带到了极端.因此,无论如何,要了解最佳实践,还要了解简单的软件是什么.通常,它包括为真正需要它们的情况保存那些最佳实践.