繁体   English   中英

a += 5 比 a = a + 5 快吗?

[英]Is a += 5 faster than a = a + 5?

我目前正在学习 C# 中的运算符和表达式,我明白如果我想将变量的值增加 5,我可以通过两种不同的方式来实现: a = a + 5a += 5 显然,第二种方式写起来更容易、更快,读起来更愉快。 但是,在计算机方面, a += 5a = a + 5快? 与较长版本的表达式相比,编译和执行所需的时间是否更少?

但是,在计算机方面,a += 5 是否比 a = a + 5 快?

两者都是相同的,first( a += 5 ) 等于第二个a = a + 5

你可能会看到:

+= 运算符(C# 参考)

使用+=赋值运算符的表达式,例如x += y等价于x = x + y只是 x 只计算一次 + 运算符的含义取决于 x 和 y 的类型(数字操作数的加法、字符串操作数的串联等)。

因此,这取决于a类型,并且在多个线程访问您的变量a情况下,您可能会得到不同的结果。 但对于大多数其他情况,它会是一样的:

对于代码:

static void Main(string[] args)
{
    int a = 10;
    a += 5;
    Console.WriteLine(a);
}

在发布模式下构建 IL

.method private hidebysig static void  Main(string[] args) cil managed
{
  .entrypoint
  // Code size       14 (0xe)
  .maxstack  2
  .locals init ([0] int32 a)
  IL_0000:  ldc.i4.s   10
  IL_0002:  stloc.0
  IL_0003:  ldloc.0
  IL_0004:  ldc.i4.5
  IL_0005:  add
  IL_0006:  stloc.0
  IL_0007:  ldloc.0
  IL_0008:  call       void [mscorlib]System.Console::WriteLine(int32)
  IL_000d:  ret
} // end of method Program::Main

通过代码生成相同的 IL:

static void Main(string[] args)
{
    int a = 10;
    a = a + 5;
    Console.WriteLine(a);
}

IL(相同)是:

.method private hidebysig static void  Main(string[] args) cil managed
{
  .entrypoint
  // Code size       14 (0xe)
  .maxstack  2
  .locals init ([0] int32 a)
  IL_0000:  ldc.i4.s   10
  IL_0002:  stloc.0
  IL_0003:  ldloc.0
  IL_0004:  ldc.i4.5
  IL_0005:  add
  IL_0006:  stloc.0
  IL_0007:  ldloc.0
  IL_0008:  call       void [mscorlib]System.Console::WriteLine(int32)
  IL_000d:  ret
} // end of method Program::Main

这取决于a是什么。 a = a + 5a求值两次。 a += 5求值a正好一次

如果a是一个整数,那么在大多数情况下这种差异可能无关紧要,尽管并非严格意义上的所有情况。 例如,如果从多个线程访问a则竞争条件的确切类型和窗口可能不同。

最重要的是,如果评估表达式会导致副作用,则是观察一次与观察两次的副作用之间的差异。 在某些情况下,这可能是一个问题,可能会影响代码的正确性,而不仅仅是速度。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM