java - 为什么 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)。
第一个循环的结构是否允许某种优化?
解决方案
首先,很有可能你认为你所看到的实际上是由于一个写得不好的基准。我强烈建议您仔细阅读以下问答并遵循其中的建议:
其次,你说的不符合我的直觉。但是,如果效果是真实的,则需要对 JIT 编译器生成的本机代码进行深入分析,以了解差异的原因。
最后,这有点“过早优化”的味道。作为一般规则,JIT 编译器可以做比人类更好(更一致、更可靠)的优化工作。如果有像您正在尝试的简单优化,JIT 编译器会找到它们。像这样的微优化通常是在浪费(你的)时间。
因此,如果您要尝试优化,那么您需要科学地进行。
- 让应用程序/库首先工作。
- 为代码编写一个现实的基准。与代码可能用于真实的方式相匹配的一种。
- 为自己设定一些可衡量的绩效目标。(“尽可能快”是不可衡量的)。
- 运行基准测试,看看您是否已经达到目标。如果是,请不要再浪费时间进行优化。
- 现在使用性能分析器运行基准测试以确定性能热点;即应用程序花费大部分时间执行的方法等。
- 选择一个热点,并寻找可能的方法使其更快。实施可能的优化......并再次运行基准测试以查看它是否有所改善。
- 重复步骤 4 到 6,直到您达到性能目标或用完可优化的热点。
推荐阅读
- arrays - 展平 Spark DataFrame 子架构
- python - 如何加载交叉点合并图
- reactjs - 如何用本机反应“编辑页面”?
- angular - 刷新浏览器不加载页面,但在通过菜单链接导航时工作(Angular)
- java - 在while循环中声明数组是否会影响空间复杂度
- php - 如何使用 VS Code PHP Debug 配置 Docker wpdiaries/wordpress-xdebug:latest?
- context-free-grammar - Solan、Horn、Ruppin 和 Edelman 的 ADIOS(结构自动蒸馏)算法
- java - 容器可移植性和 Java 语言
- c# - EF Core 5 无法触发存储过程且输出参数没有结果
- reactjs - 如何使用具有多个键但类型相同的对象数组的 SWR 变异函数