if语句条件优化

时间:2020-03-05 18:45:08  来源:igfitidea点击:

我有一个包含两个条件(由OR运算符分隔)的if语句,其中一个条件覆盖+ 70%的情况,并且处理/执行所需的时间比第二个条件少得多,因此出于速度考虑,我只希望如果第一个条件评估为false,则要处理的第二个条件。

如果我对条件进行排序,以便第一个条件(较快的条件)在满足该条件并评估为真的情况下首先出现在if语句中,那么第二个条件是否也已处理?

if ( (condition1) | (condition2) ){
  // do this
}

还是我需要嵌套两个if语句以仅在第一个条件为false时才检查第二个条件?

if (condition1){
  // do this
}else if (condition2){
  // do this
}

我在php中工作,但是我认为这可能与语言无关。

解决方案

回答

由于这是与语言无关的标签,因此我会介绍一下。至少对于Perl而言,第一种选择就足够了,我对PHP并不熟悉。它从左到右求值,并在满足条件时退出。

回答

几乎每种语言都会进行短路评估。意味着仅在绝对必要时才评估第二个条件。为此,大多数语言都使用双管道||,而不是单管道||。

参见http://en.wikipedia.org/wiki/短路评估

回答

在大多数经过适当优化的语言中,前者可以很好地工作。

回答

对于C,C ++,C#,Java和其他.NET语言,对布尔表达式进行了优化,以便一旦知道足够多,就不会评估其他任何东西。

执行混淆代码的一个老技巧是使用它来创建if语句,例如:

a || b();

如果" a"为真,则" b()"将永远不会被求值,因此我们可以将其重写为:

if(!a)
    b();

并类似地:

a && b();

会成为

if(a)
    b();

请注意,这仅对||有效和&&运算符。两家运营商|和&分别按位或者或者和和进行,因此未被"优化"。

编辑:
正如其他人提到的那样,尝试使用短路逻辑优化代码的时间很少。

首先要弄清楚,两者都是因为它更易于阅读和理解。另外,如果我们尝试变得过于机灵,则对术语进行简单的重新排序可能会导致行为的完全不同,而没有任何明显的原因。

其次,要进行优化,但要经过时间安排和分析。太多的开发人员不进行概要分析就进行过早优化的方式。在大多数情况下,它是完全没有用的。

回答

最近,我已经看到很多这类问题-优化到第n级。

我认为在某些情况下是有道理的:

  • 计算条件2不是恒定时间操作
  • 我们严格出于教育目的询问-我们想知道语言的工作原理,而不是节省3us。

在其他情况下,担心"最快"的迭代或者检查条件条件的方法很愚蠢。与其编写需要数百万次试验才能看到任何可记录的(但微不足道的)差异的测试,不如将注意力放在清晰度上。

当其他人(可能是我们!)在一个月或者一年内收到此代码时,最重要的是清晰度。

在这种情况下,第一个示例更短,更清楚,并且不需要我们重复自己。

回答

根据本文,PHP会进行短路评估,这意味着如果满足第一个条件,则甚至不会评估第二个条件。
(从文章中)测试也很容易:

<?php
/* ch06ex07 – shows no output because of short circuit evaluation */

if (true || $intVal = 5) // short circuits after true
{

echo $intVal; // will be empty because the assignment never took place
}

?>

回答

在C,C ++和Java中,语句如下:
`

if (condition1 | condition2) {
  ...
}

每次都会计算两个条件,并且仅当整个表达式为true时才为true。

该声明:

回答

VB.net有两个很棒的表达式,分别称为" OrElse"和" AndAlso"

OrElse会在第一次获得True评估时短路自身,并执行所需的代码。

if (condition1 || condition2) {
  ...
}

will evaluate condition2 only if condition1 is false. The difference is significant if condition2 is a function or another expression with a side-effect. 

There is, however, no difference between the || case and the if/else case.

Answer

The | is a bitwise operator in PHP. It does not mean $a OR $b, exactly. You'll want to use the double-pipe. And yes, as mentioned, PHP does short-circuit evaluation. In similar fashion, if the first condition of an && clause evaluates to false, PHP does not evaluate the rest of the clause, either.

Answer

While using short-circuiting for the purposes of optimization is often overkill, there are certainly other compelling reasons to use it.  One such example (in C++) is the following:

if( pObj != NULL && *pObj == "username" ) {
    // Do something...
}

并且在第一次错误评估时也会短路自身,而不评估该块中的代码。

If FirstName = "Luke" OrElse FirstName = "Darth" Then
   Console.Writeline "Greetings Exalted One!"
End If

我发现这两个都是有帮助的。

回答

短路不是为了优化。它的主要目的是避免调用无法运行的代码,但会导致可读的测试。例子:

If FirstName = "Luke" AndAlso LastName = "Skywalker" Then
   Console.Writeline "You are the one and only."
End If

请注意,如果我超出范围并导致程序崩溃,array [i]很可能会遇到访问冲突。因此,该程序当然取决于短路评估!

我认为,这是用这种方式编写表达式的原因,而不是优化方面的问题。

代码数量不匹配