关于架构:使用短路评估的好处

关于架构:使用短路评估的好处

Benefits of using short-circuit evaluation

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

在大多数语言中,b不会得到评估,因为a为false,因此a && b不能为true。我的问题是,在架构方面,短路会不会更慢?在管道中,您是否只是在等待获取a的结果以确定是否应评估b时停顿?改用嵌套ifs会更好吗?这甚至有帮助吗?

还有,有人知道通常所说的短路评估吗?这个问题是在我发现我的编程朋友从未听说过短路评估并且说它不常见,也没有在许多语言中发现并且在管道中效率低下之后出现的。我不确定最后一个,所以问大家!

好的,我想想一个不同的例子来说明我的朋友可能来自哪里。他认为,由于并行评估如下语句:

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

将使系统崩溃,没有短路的架构(因此不允许上述语句)将在处理以下语句时更快:

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

因为它不能并行执行(a),所以不能并行执行(b)。在这种情况下,允许短路的语言会比不允许短路的语言慢。

我不知道那是真的。

谢谢


如果语句是(分支基本上是goto),则短路评估以相同的方式转换为汇编语言的分支,这意味着它不会比if语句慢。

分支通常不会使管道停顿,但是处理器将猜测是否采用了分支,如果处理器错误,则必须清除自管道作出错误猜测以来发生的所有事情。

短路评估也是它的最常用名称,在大多数语言中都以某种形式出现。


n


老实说,我不会为此担心。测试布尔值确实非常快。仅当第二个表达式具有副作用时,短路才变得有趣/有用:

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

...或取决于第一次测试:

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

n


n


n


n


n


大多数语言都会对布尔表达式进行短路评估。我一直听到它被称为短路评估。

该问题中的示例是一个非常简单的示例,实际上并没有提供太多的性能优势。当表达式要计算复杂时,可以带来性能优势。

作为一个很好的例子,假设一个游戏程序具有以下内容:

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

在这种情况下,冲突检测比活动检查要昂贵得多。如果系统中有许多不活动的对象,则性能将得到显着提高。


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

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

在我看来,这非常可读,并且功能很好。通常,我会尽量避免过多的嵌套,因为这会导致代码难看。

我的所有意见。


如果不停工怎么办?实际上,如果a和b都是变量,而不是带有副作用的表达式,则可以由良好的编译器并行加载它们。除了增加行数之外,使用更多ifs没有任何好处。确实,这是第二次猜测编译器是最糟糕的一种。

这称为短路评估。


n


n


我对流水线一无所知,但是短路评估是许多语言的共同特征(这也是我所知道的名称)。在C中


根据上下文,也可以称为"防护"。

我几乎以我使用过的每种语言都看到过它-大约有十几种语言。


推荐阅读

    linux常用命令c语言?

    linux常用命令c语言?,系统,工作,信息,管理,基础,命令,地址,目录,简介,时间,li

    linux命令行设置语言?

    linux命令行设置语言?,系统,管理,环境,国家,工具,电脑,软件,文化,底部,语言,l

    linux使用命令改语言?

    linux使用命令改语言?,系统,工作,管理,电脑,设备,字符集,中文,命令,语言,虚

    c语言写linux命令?

    c语言写linux命令?,系统,工具,代码,智能,工作,环境,情况,位置,命令,文件,如何

    linux汇编语言命令?

    linux汇编语言命令?,系统,地址,代码,数据,网络,平台,平均,位置,灵活,工作,汇

    linux汇编语言命令?

    linux汇编语言命令?,系统,地址,代码,数据,网络,平台,平均,位置,灵活,工作,汇

    linux命令是什么语言?

    linux命令是什么语言?,系统,环境,代码,传播,管理,语言,操作系统,源码,自由,

    linux改语言命令行?

    linux改语言命令行?,系统,环境,工具,密码,概念,地方,软件,通信,管理,国际,lin

    linux命令行c语言?

    linux命令行c语言?,代码,系统,工具,环境,工作,保险,发行,命令,文件,终端,linu

    c语言在linux命令?

    c语言在linux命令?,系统,工作,管理,命令,保险,基础,环境,信息,文件,语言,linu

    linux编写c语言命令?

    linux编写c语言命令?,系统,基础,环境,代码,盘面,保险,百度,情况,数据,工具,在

    linux改变语言命令?

    linux改变语言命令?,系统,管理,网上,官方网站,情况,服务,中文,语言,命令,终

    c语言编译linux命令?

    c语言编译linux命令?,代码,工具,环境,系统,基础,保险,百度,语言,源程序,文件

    linux常用命令语言?

    linux常用命令语言?,工作,地址,系统,信息,命令,目录,标准,管理,工具,服务,lin

    r语言命令行写linux?

    r语言命令行写linux?,环境,数据,系统,工具,简介,官网,语言,报告,软件,发展,如

    linux语言查找命令行?

    linux语言查找命令行?,系统,工作,位置,标准,地址,信息,命令,管理,时间,文件,

    Python编程语言特征

    Python编程语言特征,代码,异常,环境,管理,培训,标准,检测,网络,特征,模块,1