В настоящее время я изучаю операторы и выражения в С#, и я понял, что если я хочу увеличить значение переменной на 5, я могу сделать это двумя разными способами: a = a + 5
и a += 5
. По-видимому, второй способ проще и быстрее писать и читать более приятно. Однако с точки зрения компьютера, a += 5
быстрее, чем a = a + 5
? Требуется меньше времени для компиляции и выполнения, чем более длинная версия выражения?
Является + 5 быстрее, чем a = a + 5?
Ответ 1
Однако, с точки зрения компьютера, + + 5 быстрее, чем a = a + 5?
Оба одинаковые, сначала (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
Ответ 2
Это зависит от того, что a
. a = a + 5
дважды оценивает a
. a += 5
оценивает a
ровно один раз.
Если a
- целое число, эта разница, вероятно, не имеет значения в большинстве случаев, хотя и не во всех случаях. Если, к примеру, к a
можно получить доступ из нескольких потоков, то точные типы и окна для условий гонки могут отличаться.
Кроме того, если оценка выражения вызывает побочные эффекты, то разница между этими побочными эффектами наблюдается один раз по сравнению с наблюдением дважды. Это может при определенных обстоятельствах быть большим делом, возможно, влияя на правильность кода, а не только на его скорость.