C#执行速度:等于(==)vs不等于(!=)

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())反之,反之亦然,这样做并不会改变程序的含义,并且当一个版本比另一个版本短时.

我的观点是,在生成的代码中,从平等到不平等的改变可能根本没有任何区别,因为编译器会自动将代码重写为更好的版本.相信编译器可以完成它的工作,并担心别的事情.

  • @Brian:你好像在那里很好地回答了你自己的问题. (3认同)

Dan*_*zey 11

我会说你应该把它写成最可读的方式.这样的微优化根本不可能对您的代码产生任何可辨别的差异:您每次比较最多只能说一次"非"操作.如果它是一个显着的差异,那么编译器可能无论如何都会优化它,但实际上这甚至没有想到.