这真的是两个问题,但是它们非常相似,为了保持简单,我想我只是把它们放在一起:
首先:鉴于已建立的Java项目,除了简单的代码内优化之外,还有哪些方法可以加快速度?
其次:在Java中从头开始编写程序时,有哪些好方法可以大大提高性能?
请远离一般优化技术,除非它们是Java特定的.
我之前曾问过Python和Perl.对于Java,我想知道有哪些好的提示/技巧可以提高性能,以及是否有任何特别好的Java分析器.
首先:通过代码优化,我会假设您已经完成了正确的算法和正确的算法实现.在这种情况下,您将使用分析器并查看您的垃圾收集器(GC)收集垃圾的频率以及它用于执行此操作的时间.然后你开始研究GC选项 - 但要注意,如果你不知道你在做什么,你可能会遇到麻烦.
我假设您使用的是java 5/6.在这种情况下,我将通过http://java.sun.com/docs/hotspot/gc5.0/gc_tuning_5.html上的java 5调优指南.还有一个关于Java性能的非常好的新信息,名为http://www.javaperformancetuning.com/,您可以订阅.
除此之外,看看你可以消除多少个try/catch块.看看你是否可以消除不必要的异常抛出.
使用Caches,但不要过度使用.
阅读有效的Java,第1版和/或第2版
Profilers:我使用你的套件.它对java 1.5及以上版本非常有用.您可以获得个人许可.其他的分析师也很好.
就像你有单元测试和集成测试一样,在你的连续集成(CI)构建中运行一些性能测试也没什么坏处.通过这种方式,您可以了解何时退化,尤其是在使用良好的CI构建服务器时.
确保您的日志级别不会意外地留在DEBUG :)
"措施,不要猜."
这是一篇关于使用NetBeans Profiler加速iText PDF库的好文章.我自己使用过NetBeans Profiler,我发现它在追踪我遇到的一些性能问题时非常容易和有用.
对于较旧的应用程序,只需迁移到Java 6可能会提升性能.有关Java 6中性能改进的信息,请参阅此白皮书.
使用最新的VM - 它们一直在变得越来越好.
简介和测试.除非您完全确定需要,否则永远不要优化您的代码.
如果它是一个GUI应用程序,从Swing切换到AWT或者Eclipse的工具包,它应该很快.这在较旧的虚拟机上更为重要(我已经嵌入了一段时间,我们实际上是1.0.x vm,甚至没有摆动)
我知道这并不是特定于Java,而是分配对象 - 这包括循环中的字符串连接(在循环之外它是非常可接受的.这是你可能做的最重要的事情.
您还可以保留对象而不是释放/重新分配它们.有一些"引用"类可用于保存您不需要但可能需要重用的对象 - 除非需要空间,否则GC不会删除它们.
如果需要,使用-MX参数分配更多空间.
加速Java有点困难 - HotSpot已经为你做了很多事情,你所做的任何你认为可能加速代码的事情往往会减慢它的速度.
使用StringBuilder代替大量的字符串连接可以提高相对性能.
但是,我不能不说一般的做法表现获益,分析.我不知道现有的Java分析(仅在学术上使用该语言),但分析可帮助您识别代码的问题部分,并且由于您需要查找某些部分,因此修复特定部分要容易得多.
不要盲目优化.使用Yourkit或任何其他优秀的分析器查找应用程序中的"热点".
您不仅需要查看CPU时间,还需要查看为特定步骤分配和释放的内存量.您还希望确保没有内存泄漏或高内存消耗.我所知道的分析内存消耗的最佳工具是Eclipse Memory Analyzer(http://www.eclipse.org/mat).
其他维度是线程争用和IO问题.有关分析争用问题的简单方法,请访问https://www.sdn.sap.com/irj/sdn/weblogs?blog=/pub/wlg/4737查看我的旧博客