Итак, у меня есть два метода, которые предполагают умножить массив целых чисел на 1000 элементов на 2. Первый метод:
[MethodImpl(MethodImplOptions.NoOptimization)]
Power(int[] arr)
{
for (int i = 0; i < arr.Length; i++)
{
arr[i] = arr[i] + arr[i];
}
}
Второй метод:
[MethodImpl(MethodImplOptions.NoOptimization)]
PowerNoLoop(int[] arr)
{
int i = 0;
arr[i] = arr[i] + arr[i];
i++;
arr[i] = arr[i] + arr[i];
i++;
arr[i] = arr[i] + arr[i];
i++;
............1000 Times........
arr[i] = arr[i] + arr[i];
}
Обратите внимание, что я использую этот код только для исследования производительности и почему он выглядит настолько отвратительным.
Удивительный результат: Power
быстрее почти на 50%, чем PowerNoLoop
, хотя я проверил декомпилированный IL
источник обоих из них, а содержимое цикла for
точно такое же, как и каждая строка в PowerNoLoop
.
Как это может быть?