Android - Запись пользовательского (составного) компонента

Нет никакого различия в сгенерированном промежуточном коде для ++ я и я ++ в этом случае. Учитывая эту программу:

class Program
{
    const int counter = 1024 * 1024;
    static void Main(string[] args)
    {
        for (int i = 0; i < counter; ++i)
        {
            Console.WriteLine(i);
        }

        for (int i = 0; i < counter; i++)
        {
            Console.WriteLine(i);
        }
    }
}

сгенерированный код IL является тем же для обоих циклов:

  IL_0000:  ldc.i4.0
  IL_0001:  stloc.0
  // Start of first loop
  IL_0002:  ldc.i4.0
  IL_0003:  stloc.0
  IL_0004:  br.s       IL_0010
  IL_0006:  ldloc.0
  IL_0007:  call       void [mscorlib]System.Console::WriteLine(int32)
  IL_000c:  ldloc.0
  IL_000d:  ldc.i4.1
  IL_000e:  add
  IL_000f:  stloc.0
  IL_0010:  ldloc.0
  IL_0011:  ldc.i4     0x100000
  IL_0016:  blt.s      IL_0006
  // Start of second loop
  IL_0018:  ldc.i4.0
  IL_0019:  stloc.0
  IL_001a:  br.s       IL_0026
  IL_001c:  ldloc.0
  IL_001d:  call       void [mscorlib]System.Console::WriteLine(int32)
  IL_0022:  ldloc.0
  IL_0023:  ldc.i4.1
  IL_0024:  add
  IL_0025:  stloc.0
  IL_0026:  ldloc.0
  IL_0027:  ldc.i4     0x100000
  IL_002c:  blt.s      IL_001c
  IL_002e:  ret

Однако это возможно (хотя очень вряд ли), что JIT-компилятор может сделать некоторую оптимизацию в определенных контекстах, которые будут способствовать одной версии по другому. Если бы существует такая оптимизация, тем не менее, она, вероятно, только влияла бы на финал (или возможно первое) повторение цикла.

Короче говоря, не будет никакого различия во времени выполнения простого преинкремента или постинкременте контрольной переменной в конструкции цикличного выполнения, которую Вы описали.

131
задан Daniel Kutik 28 June 2012 в 21:23
поделиться