Является + 5 быстрее, чем a = a + 5?

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

Кроме того, если оценка выражения вызывает побочные эффекты, то разница между этими побочными эффектами наблюдается один раз по сравнению с наблюдением дважды. Это может при определенных обстоятельствах быть большим делом, возможно, влияя на правильность кода, а не только на его скорость.