![](/img/trans.png)
[英]C# performance of static string[] contains() (slooooow) vs. == operator
[英]?: 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语句的速度。
只有当您开始深入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.