Jef*_*ard 10 c# compiler-construction optimization boolean-logic
回到我在C和C++中完成大部分工作的那一天,当然,我会手动应用deMorgan定理来优化任何非平凡的布尔表达式.
在C#中执行此操作是否有用,或者优化程序是否对此不必要?
Ana*_*tts 31
在处理器上这么快,重新排列布尔表达式几乎不可能在速度上产生任何实际差异.C#编译器非常智能,它也会优化它.优化可读性和清晰度!
JIT中的优化,以其当前的形式,并没有(从我读过的内容)为您优化.如果您需要优化它,您仍需要考虑这一点.
话虽如此,这是一个相当小的微优化.一般来说,我更喜欢以更具表现力的形式编写"非平凡的布尔表达式",以便更容易理解.对我来说,这比应用deMorgan定理得到的任何非常小的优化更有价值.
我相信这个问题的正确答案是编译器不会(通常)优化布尔评估,仅仅是由于逻辑短路,例如:
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或其他任何东西进行优化,就像其他计算机科学和软件工程一样."这取决于." 如果您使用的是非功能性评估,则可能会进行优化.老实说,你在一个疯狂的平台上谈论一些操作,你最好花时间写文档.
我希望这有帮助.