Я читаю везде, что тернарный оператор должен быть быстрее, чем, или, по крайней мере, тот же, что и его эквивалентный блок if
- else
.
Однако, я сделал следующий тест и выяснил, что это не так:
Random r = new Random();
int[] array = new int[20000000];
for(int i = 0; i < array.Length; i++)
{
array[i] = r.Next(int.MinValue, int.MaxValue);
}
Array.Sort(array);
long value = 0;
DateTime begin = DateTime.UtcNow;
foreach (int i in array)
{
if (i > 0)
{
value += 2;
}
else
{
value += 3;
}
// if-else block above takes on average 85 ms
// OR I can use a ternary operator:
// value += i > 0 ? 2 : 3; // takes 157 ms
}
DateTime end = DateTime.UtcNow;
MessageBox.Show("Measured time: " + (end-begin).TotalMilliseconds + " ms.\r\nResult = " + value.ToString());
Мой компьютер занял 85 мс, чтобы запустить код выше. Но если я прокомментирую фрагмент if
- else
и раскомментирую тройную операторную строку, это займет около 157 мс.
Почему это происходит?