是否可以让编译器自动优化我的"OR"语句?

Mic*_*ael 0 c# optimization

有没有办法让C#编译器ORif语句中优化我的子句?

例如:

if(Function_that_returns_boolean() || boolean_value)
{
    // Do something here...
}
Run Code Online (Sandbox Code Playgroud)

执行时间可能比完全不同

if(boolean_value || Function_that_returns_boolean())
{
    // Do something here...
}
Run Code Online (Sandbox Code Playgroud)

取决于Function_that_returns_boolean()内部实际工作量.


编译器不太可能(也许不可能)确切地知道效率如何Function_that_returns_boolean(),并且我的所有(简短)测试都表明OR语句总是从左到右处理,即使使用最积极的编译器优化也是如此.

这是否已由编译器处理 (即我错了)?如果没有,有什么提示我可以给它吗?

也许类似的东西Attribute让编译器知道可以自由重新排列我的代码(如果不存在,可以保留它)?

[OrStatementUsage(Speed.Fast)] // Always push statement left when possible
public bool Fast_function_that_returns_boolean()
{
    return a + b == c; // fast
}

[OrStatementUsage(Speed.Slow)] // Always push statement right when possible
public bool Slow_function_that_returns_boolean()
{
    Thread.Sleep(1000);
    return a + b == c; // slow
}
Run Code Online (Sandbox Code Playgroud)

(注意:语句中的所有方法都必须被标记,并且副作用可以作为重排的候选者)

Tho*_*ith 6

http://msdn.microsoft.com/en-us/library/6373h346.aspx

条件OR运算符(||)执行其bool操作数的逻辑或.如果第一个操作数的计算结果为true,则不计算第二个操作数.如果第一个操作数的计算结果为false,则第二个操作符将确定整个OR表达式的计算结果为truefalse.

将始终评估第一个操作数.这是一个非常重要的保证:

if (obj == null || obj.foo == "bar")
Run Code Online (Sandbox Code Playgroud)

如果编译器可以在这里重新排序条件,它将改变程序的功能.

编译器无法知道给定的重新排序是否会影响结果 - 因为它通常不能知道结果是什么,并且因为它不知道结果的哪些部分很重要.也许你想要一个长时间的延迟,或者第一次计算对程序的正确性做了重要的事情.