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

时间:2014-07-09 20:56:03

标签: c# optimization

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

例如:

if(Function_that_returns_boolean() || boolean_value)
{
    // Do something here...
}

执行时间可能与

完全不同
if(boolean_value || Function_that_returns_boolean())
{
    // Do something here...
}

取决于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
}

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

3 个答案:

答案 0 :(得分:6)

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

  

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

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

if (obj == null || obj.foo == "bar")

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

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

答案 1 :(得分:3)

不,第一个参数被评估,如果它是true,则根本不评估第二个参数。它被称为“短路”评估

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

无法指示编译器首先评估||的第二个参数。

答案 2 :(得分:2)

不,布尔逻辑运算符总是进行短路评估。如果是or,如果第二部分已经评估为真,则甚至可能无法评估第二部分。例如:

if(ReturnTrue() || SlowOperation()) { /* ... */ }

假设ReturnTrue()返回true,则永远不会调用SlowOperation()。编译器无法根据某些任意假设进行优化