[英]Is a += 5 faster than a = a + 5?
我目前正在学习 C# 中的运算符和表达式,我明白如果我想将变量的值增加 5,我可以通过两种不同的方式来实现: a = a + 5
和a += 5
。 显然,第二种方式写起来更容易、更快,读起来更愉快。 但是,在计算机方面, a += 5
比a = a + 5
快? 与较长版本的表达式相比,编译和执行所需的时间是否更少?
但是,在计算机方面,a += 5 是否比 a = a + 5 快?
两者都是相同的,first( a += 5
) 等于第二个a = a + 5
。
你可能会看到:
使用
+=
赋值运算符的表达式,例如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 + 5
对a
求值两次。 a += 5
求值a
正好一次。
如果a
是一个整数,那么在大多数情况下这种差异可能无关紧要,尽管并非严格意义上的所有情况。 例如,如果从多个线程访问a
则竞争条件的确切类型和窗口可能不同。
最重要的是,如果评估表达式会导致副作用,则是观察一次与观察两次的副作用之间的差异。 在某些情况下,这可能是一个大问题,可能会影响代码的正确性,而不仅仅是速度。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.