相关疑难解决方法(0)

使用短路评估的好处

boolean a = false, b = true;
if ( a && b ) { ... };
Run Code Online (Sandbox Code Playgroud)

在大多数语言中,b不会被评估,因为它a是假的,所以a && b不可能是真的.我的问题是,在架构方面,短路会不会更慢?在管道中,您是否只是在等待获得a的结果时停止以确定是否应该评估b?改为使用嵌套ifs会更好吗?这甚至有帮助吗?

此外,有谁知道通常所谓的短路评估?这个问题出现之后我发现我的编程朋友从未听说过短路评估,并表示它不常见,也没有在许多语言中找到,并且管道效率低下.我不确定最后一个,所以问你们大家好!

好吧,我想一个不同的例子或许可以解释我的朋友可能来自哪里.他认为,自从评估如下的声明:

(a) if ( ( a != null ) && ( a.equals(b) ) ) { ... }
Run Code Online (Sandbox Code Playgroud)

会崩溃系统,一个没有短路的架构(从而不允许像上面这样的语句)在处理这样的语句时会更快:

(b) if ( ( a == 4 ) && ( b == 5 ) )
Run Code Online (Sandbox Code Playgroud)

因为如果它不能并行地做(a),它就不能并行地做(b).在这种情况下,允许短路的语言比没有短路的语言慢.

我不知道这是不是真的.

谢谢

architecture pipeline

10
推荐指数
4
解决办法
6457
查看次数

为什么要使用短路代码?

相关问题:使用短路评估的好处,为什么语言不能使用短路评估?,有人可以解释这行代码吗?(逻辑和分配运营商)

关于使用短路代码的语言的好处有疑问,但我想知道程序员有什么好处?只是它可以使代码更简洁一点吗?还是有性能原因?

我不是在询问有关两个实体需要进行评估的情况,例如:

if($user->auth() AND $model->valid()){
  $model->save();
}
Run Code Online (Sandbox Code Playgroud)

对我而言,原因很清楚 - 既然两者都必须成立,那么如果用户无法保存数据,您可以跳过更昂贵的模型验证.

这对我来说也有明显的目的:

if(is_string($userid) AND strlen($userid) > 10){
  //do something
};
Run Code Online (Sandbox Code Playgroud)

因为strlen()使用非字符串值调用是不明智的.

我想知道的是当它不影响任何其他语句时使用短路代码.例如,从Zend Application默认索引页面:

defined('APPLICATION_PATH')
 || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'));
Run Code Online (Sandbox Code Playgroud)

这可能是:

if(!defined('APPLICATION_PATH')){
  define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'));
}
Run Code Online (Sandbox Code Playgroud)

或者甚至作为一个声明:

if(!defined('APPLICATION_PATH'))
  define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'));
Run Code Online (Sandbox Code Playgroud)

那么为什么要使用短路代码呢?仅仅因为使用逻辑运算符代替控制结构的"酷"因素?要合并嵌套的if语句?因为它更快?

coding-style short-circuiting code-structure

5
推荐指数
1
解决办法
3076
查看次数