在Java中提高性能时应该注意什么?

在Java中提高性能时应该注意什么?,java,performance,Java,Performance,我在一个大项目的维护团队工作(大约7k+班),我的日常工作主要是修复bug。不过,有时候我没有虫子来工作。当这种情况发生时,我大部分时间都在寻找代码中的性能差距。事实上,我有7000多个类要查找,这意味着找不到这些差距 因此,我想知道在试图提高系统性能时,我应该寻找哪些简单的方法? 我不是问具体的代码技术,而是问一般的技术。例如: 我已经查找了所有出现的代码,如stringa=newstring(“”),并更改为StringBuilder a=newstringbuilder() 我已将对数据

我在一个大项目的维护团队工作(大约7k+班),我的日常工作主要是修复bug。不过,有时候我没有虫子来工作。当这种情况发生时,我大部分时间都在寻找代码中的性能差距。事实上,我有7000多个类要查找,这意味着找不到这些差距

因此,我想知道在试图提高系统性能时,我应该寻找哪些简单的方法?

我不是问具体的代码技术,而是问一般的技术。例如:

  • 我已经查找了所有出现的代码,如
    stringa=newstring(“”)
    ,并更改为
    StringBuilder a=newstringbuilder()
  • 我已将对数据库的所有访问权限(如果适用)更改为使用
    PreparedStatement
  • 所有的
    Debug
    日志记录都被删除,而
    Finest
    日志记录在可能的情况下也被删除

正如您所看到的,这些更改可以很容易地进行,因为它们不需要测量系统性能——我唯一需要做的就是在Eclipse中使用搜索工具。

这是一个值得称赞的目标,但您需要将重点放在实际可证明的性能问题上,而不是放在“认为”性能问题所在的地方

花时间在剖析器中找出真正的问题…然后从那里开始。否则,你只是在乱写代码,根本不知道自己是否产生了可衡量的影响

即使你有一张“在不测量系统性能的情况下需要改变的事情”的清单,你真的相信它们适合你的情况吗

在您的情况下,我建议您花时间构建测试线束/性能仪表,这样您就可以看到哪里能让您的成本得到最大的回报

编辑: 为了解决“我知道使用事先准备好的声明会更快”的反对票和情绪,在面对这个问题时,一个更好的问题是“我应该如何最有效地利用空闲时间让事情变得更好?”OP显然想改善这种情况——这很好……但没有衡量“哪里受伤”,他实际上是在黑暗中开枪。准备好的报表快吗?当然——但如果真正的性能小精灵在其他地方,为什么要花时间“修复”DB代码,因为你可以通过追踪实际的痛点来产生真正的影响

还有一件事:在OP所描述的稳定系统中,由于引入的风险,在没有良好的量化理由的情况下进行代码更改通常被认为是不好的做法。在这种稳定的系统中,任何代码更改都必须考虑风险/回报问题。风险是巨大的:许多“简单的,不能破坏任何东西”的更改已经打滑了发布时间表/引入了重大问题。奖励?不确定,因为您实际上不知道您的更改是否导致性能提高。因此,我们进行概要分析以确保我们正在改进重要的代码。

通常:

  • 查看复杂的代码部分,看看它们是否可以被清理

  • 请特别注意循环,并查看是否有任何循环可以提高性能

  • 递归调用通常在性能上也有很大的影响。确保正确处理递归,并确保任何递归位都是正确的


  • 我要说的是寻找系统性能缓慢的领域。我天生就有点怀疑单纯为了提高性能而提高性能的尝试。我想说,您最好在代码中寻找合适的位置进行重构(听起来你们中的一些人已经这样做了;不过,我并不想学究气;重构是一件非常好的事情,但它不是,也不应该与性能改进混淆;重构可以提供引入性能改进的机会,但它们是不同的事情)

    “过早优化是问题的根源 一切都是邪恶的


    我建议使用优质工具。我的商店使用声纳。它可以帮助您:

    • 查找重复代码
    • 查找复杂代码区域
    • 查找违反代码规则和潜在错误
    • 参见代码覆盖率
    • 请参阅未记录的代码

    一般来说,仅仅查看代码库并试图通过查找某些东西来提高性能,并不保证可以获得可测量的性能增益

    通常,使用探查器找出哪些代码段运行得最多,或者相反,找出哪些代码段运行时间最长,然后寻找优化这些区域的方法更为有益。这将产生最大的好处。

    而不是专注于“慢”在应用程序的各个部分中,您应该尽量关注应用程序中“不好”的部分

    有一个自动工具可以帮助您找到

    CRAP实际上是这个工具的首字母缩略词!它可以做一些有用的事情,比如检查圈复杂度,但确实可以让你看10英尺的代码


    此外,如果确实存在瓶颈,一个好的java探查器可以帮助您找到瓶颈。

    首先,只尝试在您知道的性能大户的位置提供性能增强。这只能通过探查器来确定。在这方面,有一些nice可能会有所帮助

    第二,仅仅用StringBuilder替换字符串并不能提高性能。事实上,在许多情况下,这可能会导致性能下降。只有在将大字符串作为循环的一部分构建时,才应该使用StringBuilder,即使这样,也只能将其作为更大的运行循环的一部分。在所有其他情况下,通常都需要简单的连接呃。

    我会改变的

    字符串a=新字符串(“
     logger.debug("Initializing object state " + object.initialize() );