Тест производительности простейших операций: Модуль числа

Всякий раз, когда я пользовался Math.Min() или Math.Abs(), я думал о том, а не лучше было бы написать эти операции простым неравенством.  Наконец, я решил просто написать небольшой тестик, который должен раз и навсегда расставить все на свои места.

В качестве основы я взял почти пустой цикл:

int N = 100000000;

 

Start = DateTime.Now;

//Almost nothing!

for (int i = -N; i < N; i++)              

  result = i;

End = DateTime.Now;

Почти пустой для того чтоб компилятор не сделал каких нить слишком умных действий по его оптимизации. В первую очередь испытанию подверглась функция вычисления модуля числа. Реализовать эту простую операцию можно так:

for (int i = -N; i < N; i++)

{

  result = i;

  result = Math.Abs(i);

}

 

 

или, например, так:

for (int i = -N; i < N; i++)

{

  result = i;

  result = (i >= 0) ? i : -i;

}

 

Из времени выполнения этих циклов я вычел время выполнения пустого цикла. Получились интересные результаты:

Как видно из результатов result = (i >= 0) ? i : -i; оказался быстрее всех, как и ожидалось. Но еще более интересна разница в скорости при скрытой конвертации типов у Math.Abs(), .

Надо будет потестить и другие вещи в том же духе.