?:操作员与如果声明表现

时间:2009-02-13 19:08:31

标签: c# .net performance if-statement operators

我一直在尝试优化我的代码,以使其更简洁和可读,并希望我没有因此而造成较差的性能。我认为我的更改可能会减慢我的应用程序,但它可能只是在我脑海中。是否有任何性能差异:

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
}

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

7 个答案:

答案 0 :(得分:72)

你在这里试图micro-optimize,这通常是一个很大的禁忌。除非你有性能分析向你展示这是一个问题,否则它甚至都不值得改变。

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

尽管如此,空合并运算符的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 coalescing operator,如果值为null,则执行六个语句,而使用switch执行四个操作。

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

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

无论如何,希望你能看到这种微观尺度的优化如何能够很快开始减少回报。

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

如果您发现这样做会导致效率低下(并且这些情况很少且很少),那么您应该测量哪个具有更好的性能,然后进行特定的优化。

答案 1 :(得分:68)

恕我直言,优化可读性和理解 - 任何运行时性能提升可能与您在几个月内回到此代码并尝试了解你到底在做什么。

答案 2 :(得分:18)

  

我认为我的改变可能已经放缓了   我的应用程序,但它可能只是   在我脑海里。

除非你实际上衡量的表现,否则一切都在你的头脑中,而且是空闲的猜测。

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

答案 3 :(得分:7)

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

接下来,我想知道为什么在这种情况下你会有什么担心赞成一个声明呢?我的意思是:性能影响(如果应该有的话)将是最小的。恕我直言,这将是一种微观优化,它不值得努力 我会选择最易读,最清晰且不担心性能的陈述,因为影响最小(在这种情况下)。

答案 4 :(得分:7)

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

如果性能差异可以忽略不计,那就是可读代码

答案 5 :(得分:3)

为了讨论起见... if / then / else的运行速度与?:三元运行一样快,与单级开关/ case语句一样快。

Here are some performance benchmarks with the C# code.

只有当您开始在案例陈述中深入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;
    }

答案 6 :(得分:1)

它是机器级代码是高效还是人类可读代码的问题。 当我们让它对我们来说更容易阅读时,它会使机器执行复杂的解释代码,反之亦然...