【问题标题】:Null Coalescing Operator faster than performing the logic yourself?Null Coalescing Operator 比自己执行逻辑更快?
【发布时间】:2019-08-02 22:56:00
【问题描述】:

我们知道 Null Coalescing Operator 的使用

MyObj obj = differntObj ?? new MyObj();

等价于:

MyObj obj;
if (differntObj != null){
    obj = differntObj;
}
else {
    obj = new MyObj();
}

我的问题: Null Coalescing Operator 是否比在第二个代码 sn-p 中实现您自己的逻辑更快?如果没有,除了击键次数更少之外,还有什么好处吗?为什么要使用 Null Coalescing Operator?

【问题讨论】:

  • 击键次数还不够吗?
  • 它的简洁性也使它更快地了解正在发生的事情。至少对我来说。我一直维护其他人的代码,可读性/清晰是关键。
  • 你可能会发现这个有用 - stackoverflow.com/a/13385694/8398997
  • 我想这个问题的精神是令人钦佩的,但是当谈到微优化时,世界并不是看起来的那样。编译器和抖动很复杂,在一种情况下更快并不总是在另一种情况下。即使您给出的示例在某些情况下也会导致编译略有不同。首先要做的是努力实现可读性和可维护性,然后如果您需要大量优化,那么您就去找您值得信赖的基准测试人员并前往城镇

标签: c#


【解决方案1】:

当您编译它们并查看生成的 IL 时,您会在第二个示例中看到更多指令和分配,但这并不一定意味着它需要更长的时间。即使它这样做了,没有人会注意到。

Don’t over-focus on speed metrics; look at the big picture 专注于可读的代码,比如好的变量名和一致的风格。使用您认为更具可读性和可维护性的样式。

不管怎样,下面是从两个样本生成的 IL:

代码:

MyObj obj2 = differentObj ?? new MyObj();

IL:

.maxstack 2
.locals init (
    [0] class Test.MyObj
)
IL_0000: nop
IL_0001: ldarg.0
IL_0002: dup
IL_0003: brtrue.s IL_000b
IL_0005: pop
IL_0006: newobj instance void Test.MyObj::.ctor()
IL_000b: stloc.0

代码:

MyObj obj;
if (differentObj != null) obj = differentObj;
else obj = new MyObj();

IL:

.maxstack 2
.locals init (
    [0] class Test.MyObj,
    [1] bool
)

IL_0000: nop
IL_0001: ldarg.0
IL_0002: ldnull
IL_0003: cgt.un
IL_0005: stloc.1
IL_0006: ldloc.1
IL_0007: brfalse.s IL_000d
IL_0009: ldarg.0
IL_000a: stloc.0
IL_000b: br.s IL_0013
IL_000d: newobj instance void Test.MyObj::.ctor()
IL_0012: stloc.0

【讨论】:

    猜你喜欢
    • 2011-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-18
    • 2011-01-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多