在C#中应用DeMorgan定理在条件语句中手动优化布尔表达式是否有用(例如,如果条件)

Jef*_*ard 10 c# compiler-construction optimization boolean-logic

回到我在C和C++中完成大部分工作的那一天,当然,我会手动应用deMorgan定理来优化任何非平凡的布尔表达式.

在C#中执行此操作是否有用,或者优化程序是否对此不必要?

Ana*_*tts 31

在处理器上这么快,重新排列布尔表达式几乎不可能在速度上产生任何实际差异.C#编译器非常智能,它也会优化它.优化可读性和清晰度!

  • +1.我经常在我的代码中对布尔测试进行去优化,特别是为了可读性. (7认同)
  • 编译器无法在不导致不同时间评估的情况下优化表达式的逻辑.看到firoso的回答.虽然知道什么时候不够聪明,但它可能足够聪明. (4认同)
  • 我同意在某些情况下编译器可以安全地进行优化,但作为一般规则,它不能也不会.这个问题不是很有帮助,它更贴近温暖的模糊"不要担心它"感觉很好的答案. (3认同)

Ric*_*ett 8

您的第一个目标应该是优化这些语句,以便开发人员理解和易于维护.

DeMorgan的定理可以成为一个有用的工具.


Ree*_*sey 7

JIT中的优化,以其当前的形式,并没有(从我读过的内容)为您优化.如果您需要优化它,您仍需要考虑这一点.

话虽如此,这是一个相当小的微优化.一般来说,我更喜欢以更具表现力的形式编写"非平凡的布尔表达式",以便更容易理解.对我来说,这比应用deMorgan定理得到的任何非常小的优化更有价值.


Fir*_*oso 7

我相信这个问题的正确答案是编译器不会(通常)优化布尔评估,仅仅是由于逻辑短路,例如:

if (GetFlagA() || GetFlagB())
{
   ...do something
}
Run Code Online (Sandbox Code Playgroud)

如果调用GetFlagA可以修改GetFlagB所依赖的东西,那么评估的顺序是真正重要的(授予这是非常糟糕的代码实践,但这是另一个不同主题的主题.)这里的问题是逻辑短路,如果GetFlagA运行并且返回true,GetFlagB将永远不会运行,如此处所示,GetFlagB的结果对于语句的评估无关紧要.

A | B | =

F | F | F

F | T | Ť

T | F | 无论B的返回值如何都为真.

T | T | 无论B的返回值如何都为真.

总而言之,询问你是否可以通过使用Demorgan或其他任何东西进行优化,就像其他计算机科学和软件工程一样."这取决于." 如果您使用的是非功能性评估,则可能会进行优化.老实说,你在一个疯狂的平台上谈论一些操作,你最好花时间写文档.

我希望这有帮助.