有没有办法让C#编译器OR在if语句中优化我的子句?
例如:
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)
(注意:语句中的所有方法都必须被标记,并且副作用可以作为重排的候选者)
http://msdn.microsoft.com/en-us/library/6373h346.aspx
条件OR运算符(||)执行其bool操作数的逻辑或.如果第一个操作数的计算结果为true,则不计算第二个操作数.如果第一个操作数的计算结果为false,则第二个操作符将确定整个OR表达式的计算结果为true或false.
将始终评估第一个操作数.这是一个非常重要的保证:
if (obj == null || obj.foo == "bar")
Run Code Online (Sandbox Code Playgroud)
如果编译器可以在这里重新排序条件,它将改变程序的功能.
编译器无法知道给定的重新排序是否会影响结果 - 因为它通常不能知道结果是什么,并且因为它不知道结果的哪些部分很重要.也许你想要一个长时间的延迟,或者第一次计算对程序的正确性做了重要的事情.