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

Pau*_*des 13 java performance

我在一个大项目的维护团队(大约7k +班级)工作,我的日常工作主要是修复bug.但有时候,我没有工作的错误.当发生这种情况时,我花了大部分时间来寻找代码中的性能差距.事实上,我有超过7千个课程,这意味着找到这些差距并不明显.

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

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

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

如您所见,这些更改很容易实现,因为它们不需要测量系统性能 - 我唯一需要做的就是使用Eclipse中的搜索工具.

Dar*_*uid 56

可兑现的目标,但您需要关注实际可证明的性能问题 - 而不是您认为的"性能问题".

花时间在一个分析器中找到真正的问题......然后从那里开始.否则,你只是在搅拌代码而不知道你是否正在产生可衡量的影响.

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

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

编辑:为了解决关于"我知道使用PreparedStatement更快"的下行和情绪 - 而不是要求获得银子弹,在面对这个问题时要问的一个更好的问题是"我应该如何最有成效地花费我的自由是时候让事情变得更好了?" OP显然希望改善这种状况 - 这很棒......但是如果没有测量"它受伤的地方",他就会在黑暗中进行射击.PreparedStatement更快吗?当然 - 但如果真正的性能gremlin在其他地方,那么为什么花时间"修复"数据库代码,当你可以通过追求实际的痛点来实现真正的影响?

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

  • 是! 如果你只花费0.0000000001%的时间,那么制作一段代码是没有意义的. (5认同)

Jac*_*eow 12

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

这两个都包括Eclipse插件.


Osc*_*Ryz 8

不要盲目改变,因为它们"看起来"像是可行的.

想一想:

 logger.debug("Initializing object state " + object.initialize() );
Run Code Online (Sandbox Code Playgroud)

如果您只是盲目地删除该语句,则该对象将不会被初始化.

当然这样的陈述首先是错误的,但是,相信我他们存在!!!! 如果发生类似这样的事情,你的生活会变得悲惨.

更好的方法是使用分析器,找出哪些对象/方法/调用消耗更多时间/内存/等等,并尝试识别瓶颈.

如果你有> 7k类,很可能你只修复了一堆根本没用过的代码.

轮廓!!!!


Pet*_*ter 5

一般来说,只需查看代码库并尝试通过查找某些内容来提高性能,并不能保证您将获得可衡量的性能提升.

通常,使用分析器来查找哪些代码段运行最多,或者相反,哪些代码运行时间最长,然后查看优化这些区域的方法更为有利.这将产生最大的好处.