?:运营商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; }
它是一个问题,机器级代码是否有效或人类可读代码。 当我们使它更容易读取,它使机器做复杂的解释代码,反之亦然…