【问题标题】:C#: Compiler optimization, function calls, and Boolean expression short-circuitingC#:编译器优化、函数调用和布尔表达式短路
【发布时间】:2018-08-06 22:24:48
【问题描述】:

假设我们有以下昂贵的函数:

bool ExpensiveOp1() { ... }
bool ExpensiveOp2() { ... }
bool ExpensiveOp3() { ... }

另外,为了简单起见,假设它们都没有副作用。

我知道如果ExpensiveOp1ExpensiveOp2 在以下表达式中返回false,C# 会短路:

return ExpensiveOp1() && ExpensiveOp2() && ExpensiveOp3();

但是,如果我以这种方式编写代码,编译器是否足够聪明(因为没有更好的术语)内联函数调用并利用短路?

var x = ExpensiveOp1();
var y = ExpensiveOp2();
var z = ExpensiveOp3();
return x && y && z;

【问题讨论】:

  • 如果你真的被打扰了,你可以去var x = ExpensiveOp1; var y = ExpensiveOp2; var z = ExpensiveOp3; return x() && y() && z();
  • 谢谢,@JohanP。我可能最终会用本地函数做类似的事情。我总结了我的例子以消除不相关的细节。我实际上将长布尔表达式的结果分配给xyz。我可以将它们封装在短名称的本地函数中,并将它们放在return 语句中。
  • 谨防优先考虑微优化...
  • @Abion47,承认并同意。只是好奇以防它成为一个问题。

标签: c# optimization short-circuiting boolean-operations


【解决方案1】:

不,这是有充分理由的。编译器不知道您的任何操作是否有副作用,因此如果您在布尔短路情况之外运行它们,它会运行它们以防出现您想要的副作用。

【讨论】:

  • 这就是我所怀疑的(害怕吗?),但是当我在网上环顾四周时,我无法以一种或另一种方式确认它。感谢您证实我的怀疑。
  • @BradCollins 你可以很容易地自己测试它。见dotnetfiddle.net/nunVOV
  • 编译器对副作用一无所知,不应该关心它
  • @SergeyProsin 在 C# 8 中,他们添加了更多函数式编程风格的编译器提示,其中之一就是能够将函数标记为“纯”(即没有副作用),因为在某些情况下很高兴知道可以忽略函数。
  • @Abion47,感谢 .NET Fiddle 链接!它准确地展示了 Turksarama 上面所说的内容。现在我们将它记录在 Stack Overflow 和运行代码 sn-p 中。再次感谢。
猜你喜欢
  • 2019-08-27
  • 2015-09-12
  • 1970-01-01
  • 2012-10-25
  • 2011-05-17
  • 2021-07-12
  • 2010-11-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多