And*_*i V 4 c# optimization if-statement
我正在试图找出if语句的一些最佳实践.当我需要打开一些相等性,即需要一个if-else结构时,我通常会在"不等于"上写条件.这背后的原因通常是,当一个非成功的结果出现时,指令的数量和它们的复杂性都很低.比较过程有什么不同吗?在等于(==)和不等于(!=)之间的执行时间是否存在差异?
示例(一个相当简单的例子,但总体思路成立):
string myString = "weekend";
if(myString != "weekend")
{
Console.WriteLine("No fun...!");
}
else
{
//do a bunch of fun stuff with relatively high complexity
//can expand over many lines of code
}
Run Code Online (Sandbox Code Playgroud)
如果我改变if-else语句的顺序,执行时间有什么不同吗?
string myString = "weekend";
if(myString == "weekend")
{
//do a bunch of fun stuff with relatively high complexity
//can expand over many lines of code
}
else
{
Console.WriteLine("No fun...!");
}
Run Code Online (Sandbox Code Playgroud)
Eri*_*ert 14
首先,其他答案说(1)担心重要的事情,(2)以最好的方式编写代码,(3)如果你真的担心,测量它,是正确的.
总而言之,重要的是要认识到允许编译器以任何方式生成代码只要保留含义,并且编译器经常更改布尔的"符号" if
以便它们可以生成更好的代码.请记住,当编译器将C#转换为IL,并且抖动将IL转换为机器代码时,将不会有if
语句.在IL中,只是"在堆栈上生成一个bool;如果bool为true/false则跳转",或者在机器码中"将bool放入寄存器;现在如果寄存器为零/非零则跳转".
当你说:
if (A())
B();
C();
Run Code Online (Sandbox Code Playgroud)
编译器可以生成这些指令的等价物:
call A()
if last result is false then goto SKIP
call B()
SKIP: call C()
Run Code Online (Sandbox Code Playgroud)
或者它可以很容易地生成:
call A()
if last result is true then goto CONSEQUENCE
goto SKIP
CONSEQUENCE: call B()
SKIP: call C()
Run Code Online (Sandbox Code Playgroud)
请注意,第一个版本反转了测试的符号,比第二个版本短一个指令,因此更有可能由试图保持代码简短的优化编译器生成.
本着这种精神,允许编译器选择比较相等而不是不等式,并反转测试的符号,这样做会产生更好的代码.而且类似地,C#编译器有时会转变if (A() <= B())
为if (!(A() > B())
反之,反之亦然,这样做并不会改变程序的含义,并且当一个版本比另一个版本短时.
我的观点是,在生成的代码中,从平等到不平等的改变可能根本没有任何区别,因为编译器会自动将代码重写为更好的版本.相信编译器可以完成它的工作,并担心别的事情.
Dan*_*zey 11
我会说你应该把它写成最可读的方式.这样的微优化根本不可能对您的代码产生任何可辨别的差异:您每次比较最多只能说一次"非"操作.如果它是一个显着的差异,那么编译器可能无论如何都会优化它,但实际上这甚至没有想到.
归档时间: |
|
查看次数: |
2322 次 |
最近记录: |