繁体   English   中英

?:运算符vs。 如果陈述执行

[英]?: Operator Vs. If Statement Performance

我一直在尝试优化我的代码,以使其更加简洁易读,并希望这样做不会造成性能下降。 我认为我的更改可能会减慢我的应用程序的速度,但可能只是在我脑海中。 之间的性能有何区别?

Command.Parameters["@EMAIL"].Value = email ?? String.Empty;

Command.Parameters["@EMAIL"].Value = (email == null) ? String.Empty: email;

if (email == null)
{
    Command.Parameters["@EMAIL"].Value = String.Empty
}
else
{
    Command.Parameters["@EMAIL"].Value = email
}

我对可读性的偏爱是null合并运算符,我只是不希望它影响性能。

您正在尝试在此处进行微优化 ,这通常是一个很大的禁忌。 除非您有性能分析向您显示这是一个问题,否则甚至不值得更改。

对于一般用途,正确的答案是更易于维护的。

但就其本身而言,空合并运算符的IL为:

L_0001: ldsfld string ConsoleApplication2.Program::myString
L_0006: dup 
L_0007: brtrue.s L_000f
L_0009: pop 
L_000a: ldsfld string [mscorlib]System.String::Empty
L_000f: stloc.0 

交换机的IL为:

L_0001: ldsfld string ConsoleApplication2.Program::myString
L_0006: brfalse.s L_000f
L_0008: ldsfld string ConsoleApplication2.Program::myString
L_000d: br.s L_0014
L_000f: ldsfld string [mscorlib]System.String::Empty
L_0014: stloc.0 

对于null合并运算符 ,如果该值为null ,那么将执行六个语句,而对于switch ,将执行四个操作。

在非null值的情况下,空合并运算符执行四个操作而不是五个操作。

当然,这假定所有IL操作花费相同的时间量,事实并非如此。

无论如何,希望您能看到在这种微观规模上的优化如何开始迅速减少收益。

话虽如此,最后,对于大多数情况而言,在这种情况下最容易阅读和维护的都是正确的答案。

如果您发现这样做的效率很低(并且这种情况很少且相差甚远),则应该进行测量以查看哪种性能更好,然后进行特定的优化。

恕我直言,针对可读性和理解性进行了优化-与几个月后回到此代码并尝试了解实际情况相比,与实际情况相比,任何运行时性能提升都可能微乎其微首先要做。

我认为我的更改可能会减慢我的应用程序的速度,但可能只是在我脑海中。

除非您实际衡量的是性能,否则一切都在您的脑海和无聊的猜测中。

(不要特别挑剔您,但是看到有关性能微观优化(以及许多答案)的一个又一个问题令人失望,这些优化不包含“度量”一词。)

我怀疑不会有任何性能差异。

紧接着,我想知道为什么在这种情况下您会担心偏爱另一种说法吗? 我的意思是:对性能的影响(如果有的话)将是最小的。 恕我直言,这将是一种微观优化,因此不值得付出努力。
我会选择最易读,最清晰的语句,而不用担心性能,因为它的影响最小(在这种情况下)。

在这种情况下,几乎没有明显的性能差异。

当性能差异可以忽略不计时,一切都与可读代码有关

为了便于讨论,... if / then / else的运行速度与?:三元运算的速度一样,快于单级switch / case语句的速度。

这是一些使用C#代码的性能基准。

只有当您开始深入2-3级的情况下,性能声明才会开始受到严重影响。 也就是说,像这样的荒谬示例:

switch (x % 3)
    {
        case 0:
            switch (y % 3)
            {
                case 0: total += 3;
                    break;
                case 1: total += 2;
                    break;
                case 2: total += 1;
                    break;
                default: total += 0;
                    break;
            }
            break;
        case 1:
            switch (y % 3)
            {
                case 0: total += 3;
                    break;
                case 1: total += 2;
                    break;
                case 2: total += 1;
                    break;
                default: total += 0;
                    break;
            }
            break;
    case 2:
            switch (y % 3)
            {
                case 0: total += 3;
                    break;
                case 1: total += 2;
                    break;
                case 2: total += 1;
                    break;
                default: total += 0;
                    break;
            }
            break;
    default:
        switch (y % 3)
        {
            case 0: total += 3;
                break;
            case 1: total += 2;
                break;
            case 2: total += 1;
                break;
            default: total += 0;
                break;
        }
        break;
    }

这是关于机器级代码是有效代码还是人类可读代码的问题。 随着我们对它更易读,它使机器可以执行复杂的代码解释,反之亦然...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM