提问人:Jon 提问时间:2/14/2009 最后编辑:Wai Ha LeeJon 更新时间:1/10/2019 访问量:11410
?:操作员与。If 语句性能
?: 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 合并运算符,如果值为 ,则执行 6 条语句,而使用 switch
时,将执行 4 条操作。null
对于 not 值,null 合并运算符执行 4 次操作,而不是 5 次操作。null
当然,这假设所有 IL 操作都花费相同的时间,但事实并非如此。
无论如何,希望你能看到在这种微观尺度上进行优化是如何开始很快减少回报的。
话虽如此,最终,在大多数情况下,在这种情况下最容易阅读和维护的是正确的答案。
如果你发现你这样做的规模被证明是低效的(而且这些情况很少而且相距甚远),那么你应该衡量一下哪个具有更好的性能,然后进行特定的优化。
评论
我想我的改变可能已经放慢了 下载我的应用程序,但它可能只是 在我的脑海中。
除非你真的在衡量绩效,否则这一切都在你的脑海中和无聊的猜测中。
(不是特别挑剔你,但看到一个又一个关于性能微优化的问题(以及许多答案)不包含“度量”这个词,真是太令人失望了。
这是一个机器级代码是否高效或人类可读代码的问题。 当我们让它对我们来说更具可读性时,它使机器变得复杂地解释代码,反之亦然......
为了讨论...if/then/else 的运行速度与 ?: 三元运算的速度一样快,与单级 switch/case 语句一样快。
只有当您开始在 case 语句中深入 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;
}
评论