if语句条件优化
我有一个包含两个条件(由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]很可能会遇到访问冲突。因此,该程序当然取决于短路评估!
我认为,这是用这种方式编写表达式的原因,而不是优化方面的问题。
代码数量不匹配