Java编译器:“级联”ifs的优化和最佳实践?
Java编译器会优化这样的语句吗
if (a == true) {
if (b == true) {
if (c == true) {
if(d == true) {
//code to process stands here
}
}
}
}
到
if (a == true && b==true && c==true && d == true)
所以这是我的第一个问题:这两个版本的“CPU周期”是完全相同的,还是第一个版本的“速度较慢”
我的第二个问题是,第一个变量的级联式编程风格是否被认为是糟糕的,因为它太冗长了
(我喜欢第一个变量,因为我可以更好地对表达式进行逻辑分组,并更好地对它们进行注释(我的if语句比示例中的更复杂),但这可能是糟糕的编程风格?)更慢的是,这就是为什么我要问
谢谢 詹斯
# 1 楼答案
第一个变体使在一个或多个条件上放置断点变得更容易,并且检查条件时抛出的任何异常的堆栈跟踪也将指示检查的是哪一行
# 2 楼答案
首先,不要使用
a == TRUE
:其次,这样的代码:
被编译成(
javap -c Test
):正如你所看到的,字节码是相同的
第三,这取决于问题,但通常过于冗长。如果您对这些细节发表评论:
x = x + 1; // Increase x by 1
)-可能汇编程序是唯一的例外,因为add rax, 1 ; Increase x by 1
通知rax
是x
李># 3 楼答案
Java“编译器”可能不会在这里进行任何优化(编译两者,并反编译它们以进行比较)。但是JVM运行时很可能会这样做
然而,也就是说,这是一个微观优化;这样你的代码才是下一个开发者最容易理解的
这里的最佳实践是最可读的代码
当然,不要使用
(xxx == true)
,这是一种可怕的做法,而是使用(xxx)