boolean a = false, b = true;
if ( a && b ) { ... };

在大多数语言, b 不会得到评估,因为 a 是的假所以 a && b 不可能是真的。我的问题是,不会短路是较慢的在建筑方面?在一个管道,你刚刚摆摊,同时在等待得到的结果确定如果b应进行评估,或没有?它会好做嵌套ifs,而不是?的确,即使是有帮助吗?

此外,任何人都不会知道什么短路评估通常称为?这个问题出现之后我发现我的编程的朋友从来没有听说过短路评估,并指出,这是不常见的,也没有发现在许多语言中,而是低效率的管道。我不能肯定关于最后一个,所以问你,伙计!

好吧,我想一个不同的例子,也许解释一下我的朋友可能要来源。他认为,由于评价的一项声明如下并行:

(a) if ( ( a != null ) && ( a.equals(b) ) ) { ... }

会崩溃的系统,一个构架,没有短路(从而不允许声明,如上述)将以更快的速度在处理的发言:

(b) if ( ( a == 4 ) && ( b == 5 ) )

因为如果它不能这样做(a)平行,它不能做(b)在平行的。在这种情况下,一种语言,允许短路是慢于一个没有。

我不知道如果这是真实的。

感谢

有帮助吗?

解决方案

短路布尔表达完全等同于一些组嵌套ifs,因此是作为有效,因为这会。

如果b没有副作用,它仍然可以并行执行,与一个(任何价值"并行",包括流水线).

如果b有副作用的CPU系统结构不能取消当支预测的失败,那么是的,这可能需要延误不会如果有两侧都进行评价。所以它的东西要看看如果你这样做永远找不到那个短路的运营商创建一个业绩的瓶颈,在你的代码,但不值得担心。

但是短路是用于控制流量尽可能节省不必要的工作。它们之间的共同语言的我的使用,例如Perl成语:

open($filename) or die("couldn't open file");

外壳的成语:

do_something || echo "that failed"

或C/C++/Java/etc成语:

if ((obj != 0) && (obj->ready)) { do_something; } // not -> in Java of course.

在所有这些情况下需要短路,这样,右轴是只评价,如果所左轴规定,它应该是。在这种情况下有没有点进行比较性能的替代码这就是错了!

其他提示

短路评估被翻译成分支机构在大会语文以同样的方式,如果报表(分支机构基本上是一个转到),这意味着它是不会以任何速度慢于如果发言。

分支机构通常不拖延管道,但是处理器将猜是否支取或不,如果处理是错误的,它将需要冲洗一切已经发生了,因为它做出了错误的猜测从管道。

短路评估也是最常见的名称,并被发现在大多数语言中的一些或另一种形式。

老实说,我不会担心它。测试一个布尔的是 真快.短路只会变得有趣的/有用的,当第二个表达的副作用:

if ( ConfirmAction() && DestroyAllData() )
   Reboot();

...或者取决于第一次试验:

if ( myDodgyVar != null && myDodgyVar.IsActive() )
   DoSomethingWith(myDodgyVar);

语言支持短路:

Ada、埃菲尔,陵68,C1、C++、C#、Java、R、爱尔兰、标准ML,Javascript,MATLAB、口齿不清,Lua,方案,OCaml,Haskell,Pascal Perl,红宝石,PHP,蟒蛇,一般、视觉基础。净

采取从 短路评估

VB.Net 具有不同的语法取决于你是否不想让它短路或没有。因为旧的原因,默认行为是不是短路.该法如下

不短路

IF A And B THEN
    ...
END IF

短路

IF A AndAlso B THEN
    ...
END IF

你可以使用或/OrElse如果你想要短路的一个或声明。这是非常好的情况如下

If MyObj IsNot Nothing AndAlso MyObj.Value < SomeValue Then
    ....
End If

个人虽然我理解这短短的路可以加快速度,这绝对不是东西,显而易见的只是在寻找的代码。我可以看到一个没有经验的开发人员得到困惑的行为。它甚至似乎喜欢的东西可能发生或没有根据的编译器标志级的优化。我想怎么VB详细的关于其行为实际上,你想要完成的任务。

第一,你的朋友是错误的。短路评估(又名最小的评估)是在大多数语言,是更好的比嵌套ifs为平行的语言(在这种情况下,第一个条件返回,将导致执行继续)

在任何情况下,甚至在一个简单的不平行的语言我怎么没看到嵌套ifs将以更快的速度作为执行会块,直到第一个条件进行评估。

怎么可能一套如果没有档?实际上,如果a和b这两个变量并未表达的副作用,它们可以装在并行的一个很好的编译器。有没有受益于采用更多的ifs除了增加你的线数。真的,这将是最糟糕的一种第二猜测一个编译器。

这就是所谓短路评估。

一个有用的短路时我用的是这样的:

if (a != null && a.equals(somevalue)) {
    ... do something.
}

这是在我看来非常可读性和功能相当不错。一般来说,我尝试过了避免多套,因为它会导致丑陋的代码。

我所有的意见。

大多数语言做简短的路评估布尔的表达。我总是听见了它称为短路评估。

例如在的问题是一个非常简单的例子,并没有真正提供很多的性能受益。绩效益来的时候的表情是复杂的评估。

作为一个例子的时候这会是好想象一下,一个游戏节目已经是这样的:

if (someObject.isActive() && someOtherObject.isActive() && CollisionDetection.collides(someObject, someOtherObject) {
  doSomething();
}

在这种情况下碰撞探测是更昂贵的活动的检查。那里将是一个重要的绩效提高的,如果有大量的不活跃的对象系统。

短路、或最少的评价是,只是语法糖嵌套ifs.假设这是效率很低,或者导致摊的情况下过早的最优化。在这一点上,大多数编纂者有足够的智能正确解释和优化这些发言。使用这些声明可以大大减少排料,因此提高码的可读性,这应该是你的头号目标。

关于是否短路是有效的,管道是不太可能有多大的影响。在某些情况下可能产生影响,没有什么可以阻止编译器测试多种条件的并行,所以,只要这些试验没有副作用。另外,现代的Cpu有几个机制可用于改善管道的性能的多枝代码。

嵌套ifs将具有同等效力短路&&.

'短路评估'是最常见的名字,和你的朋友是错误的,有关它正在罕见;这是很常见的。

我不知道任何关于管道传输,但短路评估是一个共同特点多种语言(而这也是我的名字知道它通过).在C,&&及其他商定义 顺序点 就像;操作员,所以我不怎么看短路评估是任何效率较低的不仅仅是使用多个发言。

我只听说过它作为短路。在一个管道不下运,取决于成果的,如果声明?如果是这种情况下,这将更为优化的,因此它不需要检验两种价值观。

一个线程序,所以如果你有两个ifs第一个当然将是进行评估之前,第二,所以我不能看到差别。我的使用条件和操作者(这是什么&&被称为据我所知)更多套ifs.如果我要检查的东西,可能需要一段时间以评估,我做的简单试验的第一个然后就越难之后的条件。

a = obj.somethingQuickToTest() && obj.somethingSlowToTest();

似乎没有任何不同

a = false;
if(obj.somethingQuickToTest())
   a = obj.somethingSlowToTest();

根据上下文,它也可以被称为"看守".

并且我看见它在仅仅大约每一种语言,我曾在其推动近来有十几个。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top