加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 如果没有副作用,编译器/ JIT能否优化短路评估?

发布时间:2020-12-15 23:50:29 所属栏目:百科 来源:网络整理
导读:我有一个测试: if(variable==SOME_CONSTANT || variable==OTHER_CONSTANT) 在这种情况下,在平台上进行第二次测试的分支将花费更多的周期而不是简单地进行,优化器是否可以处理||作为一个简单的|? 解决方法 In this circumstances,on a platform where branc
我有一个测试:

if(variable==SOME_CONSTANT || variable==OTHER_CONSTANT)

在这种情况下,在平台上进行第二次测试的分支将花费更多的周期而不是简单地进行,优化器是否可以处理||作为一个简单的|?

解决方法

In this circumstances,on a platform where branching over the second test would take more cycles than simply doing it,would the optimizer be allowed to treat the || as a simple |?

是的,这是允许的,实际上C#编译器将在某些情况下在&&和和||,将它们减少到&和|.如您所知,评估右侧必须没有副作用.

有关生成优化的详细信息,请参阅编译器源代码.

当逻辑操作涉及提升到可空操作数时,编译器也将执行该优化.例如,考虑一下

int? z = x + y;

其中x和y也可以为空;这将生成为

int? z;
int? temp1 = x;
int? temp2 = y;
z = temp1.HasValue & temp2.HasValue ? 
  new int?(temp1.GetValueOrDefault() + temp2.GetValueOrDefault()) :
  new int?();

请注意,它是&而不是&&我知道调用HasValue是如此之快,以至于不值得额外的分支逻辑来避免它.

如果你对我如何编写可空算术优化器感兴趣,我在这里写了一个详细的解释:https://ericlippert.com/2012/12/20/nullable-micro-optimizations-part-one/

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读