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

2022-09-04 04:57:28

我在一个大项目的维护团队工作(大约7000多个类),我的日常工作主要是修复错误。但是,有时我没有错误可以处理。当这种情况发生时,我花了大部分时间在代码中寻找性能差距。事实上,我有7000多个班级要寻找,这意味着要找到这些差距并不明显。

所以我想知道在尝试提高系统性能时应该寻找哪些简单的东西?

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

  • 我已经查找了所有出现的代码,并更改为String a = new String("")StringBuilder a = new StringBuilder();
  • 我已经更改了对数据库的所有访问权限(如果适用),以使用PreparedStatement
  • 删除了所有日志记录,并在可能的情况下删除了这些日志记录DebugFinest

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


答案 1

值得称赞的目标,但你需要专注于实际可证明的性能问题 - 而不是你“认为”性能问题在哪里。

花时间在分析器中查找真正的问题...然后从那里开始。否则,你只是在搅动代码,而没有任何办法知道你是否正在产生可衡量的影响。

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

在你的情况下,我建议你花时间构建测试工具/性能仪器,这样你就可以看到在哪里获得最大的收益。

编辑:为了解决关于“我知道使用ReadyStatement更快”的反对票和情绪 - 而不是要求银弹,当面对这个问题时,一个更好的问题是“我应该如何最有效地利用我的空闲时间让事情变得更好?OP显然希望改善这种情况 - 这很棒...但是,如果不测量“哪里受伤”,他实际上是在黑暗中射击。准备状态更快吗?当然 - 但是如果真正的性能小精灵在其他方面,那么为什么要花时间“修复”数据库代码,而您可以通过追求实际的痛苦点来产生真正的影响呢?

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


答案 2

您可能希望使用以下一些静态分析工具来识别代码中的任何 Bug/潜在 Bug,并修复这些 Bug,而不是专注于性能。这些有时有助于识别性能问题:

这两者都包括Eclipse插件。


推荐