有没有办法让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
}
(注意:声明中的所有方法都必须被标记,并且副作用可以作为重新排列的候选者)
答案 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()
。编译器无法根据某些任意假设进行优化