当前位置:  开发笔记 > 编程语言 > 正文

通过重新排序优化if语句

如何解决《通过重新排序优化if语句》经验,为你挑选了3个好方法。

我记得曾经读过一次评估成员的顺序很重要.如

if (null == myClass)

那么更好(更快?)

if (myClass == null)

是这样的吗?如果有,有人可以解释如何以及为什么?如果答案需要一种语言,则瞄准c#.
谢谢



1> driAn..:

不,它不快.这是旧C天的遗物,它避免了像虫这样的虫子

if(myClass = null) /* accident, sets myClass to null instead of comparing */

所以你总是在左边有常数:

if(null = myClass) /* throws an error at compile time */

但是在C#中这样做是没有意义的我相信..



2> shoosh..:

它并不快,因为需要评估==符号的两侧.如果您有多个条件,则适用短路规则.
一个接一个地评估条件,直到达到确定的答案并且直到那时为止.
所以,如果你有

if ((a != null) && (someLongCheck()) ...

并且a为null然后someLongCheck()将不会被调用.



3> casperOne..:

嗯,这完全取决于语言和编译器.使用框架附带的C#编译器并不重要,因为IL输出是相同的.这是一个示例例程:

static void Main(string[] args)
{
    // Create the instance.
    MyClass instance = new MyClass();

    if (null == instance)
    {
    }

    if (instance == null)
    {
    }
}

IL的第一次比较如下:

L_0007: ldnull 
L_0008: ldloc.0 
L_0009: ceq 
L_000b: ldc.i4.0 
L_000c: ceq 
L_000e: stloc.1 
L_000f: ldloc.1 
L_0010: brtrue.s L_0014
L_0012: nop 
L_0013: nop

第二个:

L_0014: ldloc.0 
L_0015: ldnull 
L_0016: ceq 
L_0018: ldc.i4.0 
L_0019: ceq 
L_001b: stloc.1 
L_001c: ldloc.1 
L_001d: brtrue.s L_0021
L_001f: nop 
L_0020: nop

如您所见,除了堆栈上项目的排序外,输出几乎完全相同.操作是一样的.

如前所述,它是旧C天的遗物,其中0值的任何值都被评估为false,如果您错过了等号,则赋值被评估为条件.

您不必担心在.NET中,因为条件只接受布尔值,但如果您要与true/false进行比较,那么将字面值放在第一位可能仍然是更好的编码习惯,以免意外评估作业.

推荐阅读
郑小蒜9299_941611_G
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有