33

我一直在尝试优化我的代码,使其更加简洁和可读,并希望这样做不会导致性能下降。我认为我的更改可能会减慢我的应用程序,但它可能只是在我的脑海中。两者之间是否有任何性能差异:

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
}

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

4

7 回答 7

72

您正在尝试在这里进行微优化,这通常是一个很大的禁忌。除非你有性能分析来告诉你这是一个问题,否则它甚至不值得改变。

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

尽管如此,空合并运算符的 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,则执行六个语句,而对于switch,执行四个操作。

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

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

无论如何,希望你能看到在这个微观尺度上的优化是如何迅速开始减少回报的。

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

如果您发现这样做的规模被证明是低效的(并且这些情况很少而且相差甚远),那么您应该衡量哪个具有更好的性能,然后进行特定的优化。

于 2009-02-13T19:27:27.290 回答
69

恕我直言,针对可读性和理解进行优化 - 与您在现实世界中花费的时间相比,当您在几个月后回到此代码并尝试了解您到底是什么时,任何运行时性能提升都可能是最小的首先做。

于 2009-02-13T19:12:34.970 回答
18

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

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

(不是特别挑剔你,但看到一个又一个关于性能微优化(以及许多答案)的问题不包含“测量”一词,真是令人失望。)

于 2009-02-13T19:50:21.527 回答
7

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

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

于 2009-02-13T19:13:47.073 回答
7

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

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

于 2009-02-13T19:17:45.473 回答
2

为了讨论... 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;
    }
于 2014-09-14T13:53:23.027 回答
1

这是机器级代码是有效的还是人类可读的代码的问题。当我们使它对我们更具可读性时,它使机器能够复杂地解释代码,反之亦然......

于 2013-05-11T11:28:47.397 回答