.NET 3.5/C#:if()==和之间是否存在性能差异=

.NET 3.5/C#:if()==和之间是否存在性能差异=,c#,.net,C#,.net,使用if()语句时,从性能角度看,使用==或!=是否更好 if(object==null) 或 在if()序列中,成功概率最高的语句应该排在第一位吗?我认为这对性能没有任何影响。我更喜欢先测试积极的条件——称之为乐观的方法。这样做会使我的代码更容易阅读(无论如何对我来说)。你不必在意 如果你这么关心效率,你应该用低级语言写作。不是.Net。我很怀疑你是否注意到任何明显的区别;不仅如此,还有brtrue和brfalseIL运算符 如果您有性能问题,请使用探查器,查看实际问题;不会是这样的。。。这

使用if()语句时,从性能角度看,使用==或!=是否更好

if(object==null)


在if()序列中,成功概率最高的语句应该排在第一位吗?

我认为这对性能没有任何影响。我更喜欢先测试积极的条件——称之为乐观的方法。这样做会使我的代码更容易阅读(无论如何对我来说)。

你不必在意


如果你这么关心效率,你应该用低级语言写作。不是.Net。

我很怀疑你是否注意到任何明显的区别;不仅如此,还有
brtrue
brfalse
IL运算符

如果您有性能问题,请使用探查器,查看实际问题;不会是这样的。。。这是过早的优化

该声明是否应与最高 成功的概率是第一位的 if()序列

一般来说是的。在布尔表达式中使用
&&
| |
运算符将导致短路求值-如果对第一项的求值使表达式不可否认为真,则不会对其他项求值


至于
==
的对比=,即使存在性能差异,也不会产生您会注意到的差异

如果代码的形式是:-

if(obj == null)
{
    // blah
}
else
{
    // blah
}
编译器将把if语句翻译成具有同等性能的分支brtrue或brfalse

这听起来有点像你在微观优化;如果你需要问的话,很可能是你太热心了


如果您确实确定会有差异,那么可以尝试以两种方式编写代码,并在代码周围运行秒表,或者使用探查器。在你测量它之前,它仍然是理论,而且我们的本能往往比我们想象的更偏离这些事情

它们之间应该没有性能差异

当你用
&&
|
链接它们时,试着把便宜的比较放在第一位。由于短路,如果左侧已经确定结果,程序将不会计算运算符的右侧(这在其他方面也很方便)

例如,对计算机来说,比较引用要比操作字符串容易得多。正如您已经建议的,将最频繁发生的情况放在一起可能会有好处

但是,如果可能的话,在优化时尽量不要弄乱可读性。为了微观优化而牺牲可读性是很难证明的

例如:

if (myString != null && myString.ToUpper() == "FOO")
{
    // This works because of short circuiting.
    // myString.ToUpper() will never be evaluated if myString is null.
}

我刚刚分析了.NET Reflector中的以下代码:

public static void Main(string[] args)
{
    object obj2 = null;
    if (obj2 == null)
    {
        Console.WriteLine("Is null");
    }
    if (obj2 != null)
    {
        Console.WriteLine("Is not null");
    }
}
下面是结果IL:

.method public hidebysig static void Main(string[] args) cil managed
{
    .custom instance void [mscorlib]System.STAThreadAttribute::.ctor()
    .maxstack 1
    .locals init (
        [0] object obj2)
    L_0000: ldnull 
    L_0001: stloc.0 
    L_0002: ldloc.0 
    L_0003: brtrue.s L_000f
    L_0005: ldstr "Is null"
    L_000a: call void [mscorlib]System.Console::WriteLine(string)
    L_000f: ldloc.0 
    L_0010: brfalse.s L_001c
    L_0012: ldstr "Is not null"
    L_0017: call void [mscorlib]System.Console::WriteLine(string)
    L_001c: ret 
}

从上面看来,使用if()检查对性能没有影响。但是,您可以这样看—尝试使用最有可能发生的if()检查。因此,如果对象在if检查时很少为null,那么就使用if(object!=null)。+

我首先警告不要过早进行性能优化。关注可读性

这就是说,我将检查由这些产生的IL。这将告诉您每个操作需要多少操作


我从来没有做过系统程序员,所以我从来没有真正深入研究过CPU级别的性能调优。

使用静态预测的旧处理器在填充管道时假设条件是错误的。我认为这已经无关紧要了。

使用!=而不是我们被问这个问题弄糊涂了。操作符的选择并不重要,这些类型的微优化不应该考虑到应用程序的设计中

然而,if的顺序是重要的。C#的&&和| |运算符是短路的,这意味着如果&&的第一个条件为假,那么C#将不会计算第二个条件——同样,如果| |的第一个条件为真,那么计算第二个条件就没有意义

你可以利用短路来发挥你的优势。经验法则是按如下方式构造条件:

if(loginAttempts < 3 && existsInDatabase(username, password)) { ... }
  • 使用&&时,最有可能失败的条件应排在第一位
  • 使用| |时,最有可能成功的条件应排在第二位
  • 需要很长时间才能执行的条件应排在最后
举一个简单的例子:

if(existsInDatabase(username, password) && loginAttempts < 3) { ... }

像这样的小调整有时会产生巨大的变化,但在进行此类更改之前,您确实需要对其进行分析。如果您花费20个开发人员小时来搜索代码并重新编写If语句以获得最佳执行,但您的应用程序只需加速0.5秒,那么净节省时间为-19.99小时。在对应用程序进行微优化之前要考虑到这一点。

当我开始在代码中考虑类似的问题时,我想起了罗伯特·格拉斯(Robert Glass)在《软件工程的事实和谬误》一书中的一句话

“效率来源于良好的设计,而不是良好的编码。”

杰夫在这本书上发表了一篇文章,列出了事实和谬误:

说得好。考虑到没有任何显著的性能差异,最重要的问题应该是代码的清晰性。并不是存在性能问题,我正在尽可能主动地进行优化。这个问题是我时常想到的,我认为得到一个集体的答案会很有帮助。好吧,现在你有了你的答案。从性能角度来看,人们用右手拇指比左手拇指更快地击中空格吗?这一点都不重要。从可读性的角度来看,可能是这样的。通过检查a==和!=之间的效率来提高程序的效率这完全是浪费时间。就我的0.02。两方面都试试。出去
if(loginAttempts < 3 && existsInDatabase(username, password)) { ... }