?:运营商VS. 如果声明性能

我一直在试图优化我的代码,使其更加简洁和可读,希望不会导致性能下降。 我想我的改变可能会减慢我的申请,但这可能只是在我的脑海中。 是否有任何性能差异:

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 } 

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

恕我直言,优化的可读性和理解 – 任何运行时间的性能增益可能是最小的时间,你花了几个月时间回到这个代码的实际情况,并试图了解你到底是什么首先做。

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

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

尽pipe如此,无结合算子的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操作都花费相同的时间,事实并非如此。

无论如何,希望你可以看到如何在这个微观规模优化可以开始减less回报很快。

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

如果你发现你在这个效率低下的情况下(而且这种情况很less,那么你应该测量一下,看看哪个性能更好,然后进行特定的优化)。

我想我的改变可能会减慢我的申请,但这可能只是在我的脑海中。

除非你真的在衡量业绩,否则这一切都在你的脑海里,而且是闲散的猜测。

(特别是不要select你,但是看到关于性能微观优化(以及许多答案)的问题后面的问题是如此令人失望,因为它不包含“度量”一词。)

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

接下来,我想知道为什么在这种情况下你会有任何偏袒一方的问题呢? 我的意思是:性能影响(如果有的话)将是最小的。 恕我直言,这将是一种微观优化,它不应该是值得的努力。
我会select最具可读性,最清晰的陈述,而不用担心performance,因为它影响最小(在这种情况下)。

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

当性能差异可以忽略不计时,这全是关于可读代码的

为了讨论的缘故,if / then / else的运行速度与?:三元运算的运行速度一样快。

这里有一些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; } 

它是一个问题,机器级代码是否有效或人类可读代码。 当我们使它更容易读取,它使机器做复杂的解释代码,反之亦然…