我到处都读到,三元运算符应该比它的等效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毫秒。
为什么会这样?