我有一个半大型 Java 应用程序。它写得很糟糕,我怀疑我可以做很多简单的事情来清理一些东西并提高性能。
例如我最近发现
String.matches(regex)
函数在具有相同正则表达式的循环中使用了很多。所以我用预编译的 Patterns替换了它。我使用 FindBugs(顺便说一句很棒),但没有发现这个问题,而且我在工作中可以使用的工具有限。
还有什么像这样简单的东西我应该看看吗?
我有一个半大型 Java 应用程序。它写得很糟糕,我怀疑我可以做很多简单的事情来清理一些东西并提高性能。
例如我最近发现
String.matches(regex)
函数在具有相同正则表达式的循环中使用了很多。所以我用预编译的 Patterns替换了它。我使用 FindBugs(顺便说一句很棒),但没有发现这个问题,而且我在工作中可以使用的工具有限。
还有什么像这样简单的东西我应该看看吗?
首先使它成为一个编写良好的应用程序。以我的经验,大多数性能优势不会来自做愚蠢的事情,而不是做聪明的优化。
当您有一个编写良好的应用程序时,就该运行分析器并仅优化重要的部分。
性能有问题吗?如果是这样,我不会重做任何事情,直到我在各种条件下分析代码并且手头有一些硬数据告诉我时间花在了哪里。你可能正在改变一些根本没有好处的事情。
我会担心线程安全。对此给予了多少关注?
如果要重构,请先编写 JUnit 测试。它将帮助您熟悉代码并为您提供安全网。测试必须在更改前后通过。
最重要的是,不要仅仅因为你认为它一团糟而进行大的重构。在开始之前,您的团队和客户应该参与您正在做的事情。您是否将您的(公认的好)想法传达给他人?软件是一项团队运动;沟通是关键。
重构以改进应用程序时要做的一件非常重要的事情是首先重构代码,以使源代码看起来至少不错。完成之后,永远不要猜测优化的地方,总是衡量瓶颈在哪里,并专注于解决这些问题。通常,程序员喜欢做一些事情,例如为循环交换递归方法,选择完全正确的排序算法等,这些事情通常几乎没有什么区别。因此,请确保关注正确的区域(使用过多的 CPU?内存?过多的线程?长线程锁?)
编辑:就像其他海报中写道的那样,当然要确保您团队中的其他人/您的老板认为这项工作也值得做,如果这对他们来说不是问题,他们可能会不在乎。
如果您喜欢书籍,我强烈建议您阅读Josh Bloch 的《 Effective Java》。
通过分析器运行代码(检查速度和内存)。一旦你发现它慢的地方(通常不是你认为的地方),找出你可以做些什么来加速它。
另一个有用的东西(如果你有点勇敢的话)是使用 NetBeans 7.0 M2(不要太恐慌,它们的非发布版本通常非常稳定)有一个名为“Jackpot”的插件可以搜索你的代码以进行重构。其中一些与性能有关……但我认为它们中的任何一个都不会在速度方面做出根本性的改变。
一般来说,保持代码干净易读,它会很快。当它不快时,你会比如果它是一团糟更容易加速它。
有一次我在写一些我知道必须快速的东西(它是解析类文件的代码)时,我所做的就是在每次我进行更改时运行分析器。所以一步我想我会通过调用 String.,intern 来减少内存,以确保所有的字符串都汇集在一起。当我添加 intern() 调用时,内存确实下降了一点,但时间增加了很多(String.intern 不必要地慢,或者是几年前)。所以在那一点上,我知道我刚刚做的事情慢得令人无法接受,我取消了那个改变。
我不建议在一般开发中这样做,但是每天或每周通过分析器运行一次代码只是为了看看情况如何并不是生产力杀手。