编程语言
首页 > 编程语言> > Java if语句结构和指令流水线

Java if语句结构和指令流水线

作者:互联网

问题:这更多是出于好奇心而不是其他任何事情.如果我有一个Java if / else语句,并且我知道’if / else’语句的一个分支将比另一个分支更频繁地使用,那么我订购这两个分支的方式是否提供了一个提示JIT编译器可以带来更好的性能吗?

背景:
在我简单的计算机体系结构视图中,“if / else”语句被转换为一个条件跳转指令,后跟在没有执行跳转时应该执行的指令.内存中的其他位置将是跳转所针对的代码.据我了解,CPU会按顺序加载指令(我确定我在这里忽略了分支预测器),并且非跳转路径有更高的机会被加载到指令缓存和CPU中指令管道.

问题重述:if / else语句的分支的合理排序是否会增加经常执行的代码紧跟条件跳转指令的可能性,这将使代码对缓存和管道更友好?

现实:听到JIT编译器是如此复杂的软件,在完成所有指令重新排序,寄存器分配和其他簿记后,我不会感到惊讶,它无法做出这样的保证.

我的大多数’if / else’语句都会被取消执行,所以我不会到处都这样做.此外,很多时候我会猜错哪个分支将更频繁地执行并最终实际上损害性能.

我想这样一个简单的事情,如故意用分支排序不会被认为是过早的优化,但如果是,我只会弄乱订单,如果一个分析器告诉我代码很慢.

谢谢!

解决方法:

没有.

你不能.你不需要.

它对编译器有一定意义,因为它可以翻译

if (improbable) {
    doSomething();
} else {
    doSomethingElse();
}
doMoreThings();
return;

进入(伪代码)

if (improbable) goto away
doSomething()
back: doMoreThings()
return
away: doSomethingElse()
goto back

这样就可以简化更可能的路径. AOT编译器可以依赖提供的信息.

你不需要.但是收集统计信息之后,Java JIT编译器就会这样做.在这里,javac是无关紧要的,因为字节码被解释器执行了几次,这很慢,但对于很少执行的部分和足以收集统计信息的部分来说已经足够了.通常,这些统计数据优于程序员可能提供的数据,但更重要的是:它们会针对每个与时间相关的代码进行收集.它实际上更复杂,因为那里有C1和C2编译器……

你不能.在字节码中没有标准化的表达方式.此外,优化器会在内部表示中转换代码,这些细节会丢失.

过早优化忘了它.编译器可以很好地完成更复杂的事情.一些低级优化仍然有意义,但仅限于非常极端的情况.如果需要,可以使用干净的代码并进行一些高级优化.

标签:java,cpu-architecture,performance
来源: https://codeday.me/bug/20190628/1310635.html