这个简单的条件运算符将在编译时优化吗? (。净)

时间:2011-11-02 19:24:46

标签: c# .net performance optimization conditional-operator

使用遗留代码,我发现我得到了很多这样的声明(超过500个)

bool isAEqualsB = (a == b) ? true : false;

像这样重写它是否有意义?

bool isAEqualsB = (a == b)

或者将在编译时进行优化?

提前致谢,

桑蒂! =)

4 个答案:

答案 0 :(得分:8)

忽略性能 - 所以不太可能成为瓶颈,在您证明与适当的基准测试相关之前,它不应该是您的想法。

绝对关心可读性 - 从这个角度来看,我认为第二种方法要好得多,并且肯定会使用它。

编辑:在优化方面,看起来C#编译器没有优化它:

  // First form
  IL_0000:  ldarg.0
  IL_0001:  ldarg.1
  IL_0002:  beq.s      IL_0007
  IL_0004:  ldc.i4.0
  IL_0005:  br.s       IL_0008
  IL_0007:  ldc.i4.1
  IL_0008:  stloc.0

  // Second form
  IL_0009:  ldarg.0
  IL_000a:  ldarg.1
  IL_000b:  ceq
  IL_000d:  stloc.1

然而,当然不是IL也不重要 - 这就是JIT编译器的作用。现在,即使IL大小的差异可能意味着内联之间的区别而不是......

答案 1 :(得分:4)

替换第一个语句是有意义的,无论它是否会被优化。

bool isAEqualsB = (a == b)

这只是更干净的代码a == b是一个布尔表达式,不需要任何其他内容。将其视为改进代码库的可维护性和可读性的重构,而不一定是性能获胜。

答案 2 :(得分:2)

绝对重写它。编译器可能会进行此优化,但这并不重要,因为如果您现在花时间修复它,代码将更具可读性。

更好的是,首先取消这些变量声明,并将其用途替换为a == b

此外,找到编写此代码并给他们邪恶眼睛的人:)

答案 3 :(得分:1)

如果代码正常工作,我会保持原样。你将用它来重写它的时间将永远无法偿还。是的,第二种方法更清晰,更容易阅读,但它会花费你时间来改变该模式的500多次出现,并且发生错误的可能性 - 将工作代码转换为非工作代码 - 是非零。您从重构中获得的小的可读性好处将无法弥补进行更改所需的时间和风险。

就执行而言,编译器几乎肯定会优化第一个到第二个。但正如其他人所说,即使编译器没有对其进行优化,性能提升也会微乎其微。

但我肯定会将第二种方法用于新代码。