![]() |
1
1
如果您真的想弄清这一点,可能需要指示JVM打印程序集。根据我的经验,对循环的细微调整可能会导致令人惊讶的性能差异。但这不一定是由于循环本身的优化。 有很多因素会影响代码的JIT编译方式。 例如,调整方法的大小可能会影响内联树,这可能意味着更好或更差的性能,具体取决于调用堆栈的外观。如果一个方法内联到调用堆栈的更高层,它可能会阻止嵌套的调用站点内联到同一框架中。如果这些嵌套的呼叫站点特别“热门”,那么增加的呼叫开销可能会很大。我并不是说这就是原因;我只是指出,有许多阈值控制JIT如何安排代码,性能差异的原因并不总是显而易见的。
将JMH用于基准测试的一个好处是,可以通过显式设置内联边界来减少此类更改的影响。但你可以使用
当然,还有其他因素,如缓存友好性,需要更直观的分析。考虑到你的基准
可能
没有特别深入的调用树,我倾向于将缓存行为作为更可能的解释。我猜你的第二个版本表现更好,因为你的比较对象(
消除死代码也可能是一个因素。我必须看看您的输入是什么,但您的手动优化版本可能会导致某些指令块在插入指令的解释阶段永远不会被命中,从而导致JIT将其从最终组装中排除。 我重申:如果您想弄清这一点,您需要强制JIT为每个版本转储程序集(并与C版本进行比较)。 |
![]() |
2
1
这个if语句简化了很多工作(尤其是在输入字符串末尾找到模式时)。
在第一个版本中,您必须检查
在第二个版本中,您不需要这样做。 但奇怪的是,我认为对于较小的输入,它并没有带来太大的不同。 您能否分享您用于基准测试的项目的长度? |
![]() |
3
0
应该跳出去。同样,基准测试很棘手。你会发现同样的问题有很多答案。 |
![]() |
Sam · jvm如何优化循环代码? 7 年前 |
![]() |
pushpavanthar · 纱线中的调谐火花作业 7 年前 |
![]() |
Ashish K · 在Groovy中将字符串参数传递给对象方法参数 7 年前 |
![]() |
St.Antario · 在Java中侦听多个目录以创建文件 7 年前 |
![]() |
Bonsaisteak · 为什么年轻一代需要三个区域来收集垃圾? 7 年前 |