假设我有一个IF
条件:
if (A || B)
∧
|
|
left
{
// do something
}
现在假设它A
更有可能收到一个真实的价值B
,那么我为什么要关心左边的哪一个呢?
如果我将它们都放在IF
括号中,那么我知道(作为代码的程序员)需要双方。
问题是,我的教授在他的讲义上写道,我应该把“更可能的变量接受一个真实的”放在左边。
有人可以解释一下好处吗?好吧,我把它放在左边……我得到了什么?运行 ?
假设我有一个IF
条件:
if (A || B)
∧
|
|
left
{
// do something
}
现在假设它A
更有可能收到一个真实的价值B
,那么我为什么要关心左边的哪一个呢?
如果我将它们都放在IF
括号中,那么我知道(作为代码的程序员)需要双方。
问题是,我的教授在他的讲义上写道,我应该把“更可能的变量接受一个真实的”放在左边。
有人可以解释一下好处吗?好吧,我把它放在左边……我得到了什么?运行 ?
它不仅仅是选择左边最可能的条件。您还可以在左侧设置安全卫士,这意味着您只能下一个订单。考虑
if (s == null || s.length() == 0) // if the String is null or empty.
您不能在此处交换顺序,因为第一个条件可以保护第二个条件免于抛出 NPE。
同样,您可以拥有
if (s != null && s.length() > 0) // if the String is not empty
选择最可能为真||
或假的&&
原因是微优化,以避免在第二个表达式中进行评估的成本。这是否会转化为可衡量的性能差异是值得商榷的。
我把它放在左边......我得到了什么?运行时间?
因为||
C++ 中的运算符使用短路求值。
ie:B
仅当A
被评估为 a时才被评估false
。
但是,请注意,在 C++ 中,保证“内置”数据类型而不是自定义数据类型的短路评估。
根据javadoc
&& 和 || 运算符对两个布尔表达式执行条件与和条件或运算。这些运算符表现出“短路”行为,这意味着仅在需要时才评估第二个操作数
因此,如果真正的语句在顺序中排在第一位,它会在运行时将第二个操作数短路。
如果左边的表达式为真,则不需要计算右边的表达式,因此可以在运行时对其进行优化。这是一种称为短路的技术。因此,通过将表达式更可能为真放置在左侧,我们可以期望我们的程序执行得更好,而不是相反。
您应该首先放置更有可能为真的条件,因为这会导致 if 语句短路。这意味着它不会评估 if 语句的其余部分,因为它已经知道答案是正确的。这使代码更有效率。
当您的 if 语句评估昂贵的东西时,这尤其有用:
if(doExpensiveCheck1() || doExpensiveCheck2()) { }
在这种情况下,由于支票价格昂贵,首先放置最有可能的支票对您有利。
在许多情况下,除了微小的性能改进外,没有任何实际区别。如果您的检查是非常昂贵的函数调用(不太可能),或者您需要按顺序检查,这变得有用。例如,假设您想检查某物的属性并首先检查某物是否为 nil,您可能会执行以下操作:
如果 (a != nil && a.attribute == 有效) {}
是的,您正在获得运行时间,对于一次操作来说似乎并不多,但您必须记住,操作将重复数百万次
为什么要在一个足够的情况下执行两个评估是逻辑
在运行时 if(a||b) 将首先测试 a,如果 a 为真,则不会浪费时间测试 b,因此编译器将提前执行 1 次。因此,如果 a 比 b 更可能为真,则此测试也可能削减 1 条线。单行上未执行的总行数很小,但如果语句嵌套在某种循环中(for、while、recession 或与数据库相关的查询),则它是巨大的。例如,我们有 100 万分钟来测试数据库中的数据,每条记录 1 分钟(条件 A 为 30 秒,条件 B 为 30 秒)。假设 A 有 80% 的机会是真的,B 有 20% 的机会是真的。如果你先放 A 所需的总时间是 600-000 小时,但如果你先放 B 则需要 900-000 小时。如果先测试 A [(0,8*1 百万小时)*0,5 分钟+(0,2*1 百万小时) *1min]===6000-000hrs : 如果 B 先测试 [(0,2*1million hours)*0,5mins+(0, 2*100 万小时)*1 分钟]===9000-000 小时。但是,如果 A 变为真的概率更接近 B 的概率,您会注意到差异不那么显着。
public class Main
{
public static void main(String[] args) {
System.out.println("Hello World");
Integer a = null;
Integer b = 3;
Integer c = 5;
if(a != null && a == 2){
System.out.println("both");
}else{
System.out.println("false");
}
}
}
你好世界
假