我想知道以下两个代码块是否存在性能差异
1>
if(name == null) {
//something
}
if(name != null) {
//something
}
和
2 - ;
if(name == null) {
//something
}
else {
//something
}
答案 0 :(得分:5)
第一次比较两次,第二次比较一次。差异不明显,但它就在那里。
答案 1 :(得分:5)
在 100.000.000次迭代上进行基准测试后,第一次执行成本 719ms ,第二次 703ms 。
我使用了模数,因此条件必须在每个回合中改变并避免预编译结果。请在下面找到代码。我注意到,当迭代次数增加时,这个差距就会缩小。
public static void main(String[] args) {
Date start1 = new Date();
for(int i=0; i<100000000; i++) {
int it = i%2;
if(it == 0) {
double j = Math.random();
j++;
}
if(it != 0) {
double j = Math.random();
j++;
}
}
Date end1 = new Date();
Date start2 = new Date();
for(int i=0; i<10000000; i++) {
int it = i%2;
if(it == 0) {
double j = Math.random();
j++;
} else {
double j = Math.random();
j++;
}
}
Date end2 = new Date();
System.out.println((end1.getTime()-start1.getTime())+" / "+(end2.getTime()-start2.getTime()));
}
答案 2 :(得分:2)
只是一个简短的评论,说编译器无法在所有情况下对其进行优化,因为name
在第一个if
块中可见,因此它可能已在其中进行了修改,因此它必须是在第二个if
条件下再次检查。想象一下这个案例:
if (name == null) {
// Does something
name = "Did it.";
}
if (name != null) {
// Does something else
}
显然不等于
if (name == null) {
// Does something
name = "Did it.";
} else {
// Does something else
}
如果您实际上意味着您应该在一个案例中执行某些操作而在其他情况下执行其他操作,请使用if { ... } else { ... }
- 不仅仅是(最小)性能改进,还因为您的代码应该反映您实际意味着什么
答案 3 :(得分:1)
请注意,这两个片段不一定相同,因为第一个块可以重新分配name
,以便第二个条件也为真。
这可能会引入难以发现的错误,所以我建议(在考虑性能之前),如果可能的话,考虑制作变量final
并在有意义时使用if / else(即它应该只输入两个分支中的一个)并且当它有意义时链接(例如,当第一个if可以为下一个使用时建立默认值时)。
答案 4 :(得分:0)
是的,第二个只检查一个条件,在第一个条件下必须检查两个条件。
未通过评估的if
子句必须进行“指令跳转”,即使后面没有else
语句。
假设第一个if
为假,您将比较这两个执行方案:
1>
Check 1st condition
Skip to check 2nd condition
Do "something" inside the 2nd condition
2>
Check condition
Skip to "something" inside the else
答案 5 :(得分:0)
是的,因为两个if
案例将在第一个案例中进行评估,而只有一个if
将在第二个案例中进行评估。
答案 6 :(得分:0)
是的,会有区别:在第二个例子中,tehre只有1个要证明的陈述,在第一个有两个。
但是:性能上的差异绝对是最小的,在99%的情况下你甚至都没有发现任何差异 - 确保你的代码尽可能可读,这就是更重要的是;)
答案 7 :(得分:0)
是的,显然第二个代码会表现得更好,因为只有一个条件需要检查
答案 8 :(得分:-1)
我相信编译器足够智能,可以注意到第一个示例中的第二个if是冗余的,因此不会有任何性能变化