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

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

概述我有一个测试: if(variable==SOME_CONSTANT || variable==OTHER_CONSTANT) 在这种情况下,在平台上进行第二次测试的分支将花费更多的周期而不是简单地进行,优化器是否可以处理||作为一个简单的|? In this circumstances, on a platform where branching over the second test wou 我有一个测试:

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/

总结

以上是内存溢出为你收集整理的c# – 如果没有副作用,编译器/ JIT能否优化短路评估?全部内容,希望文章能够帮你解决c# – 如果没有副作用,编译器/ JIT能否优化短路评估?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1221191.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存