首页 > 解决方案 > 为什么 for (int i = 0; i + 9 < s.length(); i++) 比 for (int i = 0; i < s.length()-9; i++) {

问题描述

s 是一个长度最多为 100000 个字符的字符串。

当我运行第一个循环时:

for (int i = 0; i + 9 < s.length(); i++)

我的测试集运行时间为 14 毫秒。

当我运行第二个循环而不是第一个循环时:

for (int i = 0; i < s.length() - 9; i++)

对于相同的测试集,它始终比第一个循环多花费大约 2 倍(28ms)。

第一个循环的结构是否允许某种优化?

标签: javaperformance

解决方案


首先,很有可能你认为你所看到的实际上是由于一个写得不好的基准。我强烈建议您仔细阅读以下问答并遵循其中的建议:

其次,你说的不符合我的直觉。但是,如果效果是真实的,则需要对 JIT 编译器生成的本机代码进行深入分析,以了解差异的原因。

最后,这有点“过早优化”的味道。作为一般规则,JIT 编译器可以做比人类更好(更一致、更可靠)的优化工作。如果有像您正在尝试的简单优化,JIT 编译器会找到它们。像这样的微优化通常是在浪费(你的)时间。

因此,如果您要尝试优化,那么您需要科学地进行。

  1. 让应用程序/库首先工作。
  2. 为代码编写一个现实的基准。与代码可能用于真实的方式相匹配的一种。
  3. 为自己设定一些可衡量的绩效目标。(“尽可能快”是不可衡量的)。
  4. 运行基准测试,看看您是否已经达到目标。如果是,请不要再浪费时间进行优化。
  5. 现在使用性能分析器运行基准测试以确定性能热点;即应用程序花费大部分时间执行的方法等。
  6. 选择一个热点,并寻找可能的方法使其更快。实施可能的优化......并再次运行基准测试以查看它是否有所改善。
  7. 重复步骤 4 到 6,直到您达到性能目标或用完可优化的热点。

推荐阅读