从长度不同的两个数组中获取价值的时间不同

时间:2019-05-07 17:29:37

标签: c#

令我惊讶的是,从第一个数组获取索引值比从第二个数组获取索引需要更多的时间。它不依赖于长度,在我的测试中,对于任何组合都是如此。我猜这取决于一些低级的优化。有人可以解释吗? 下面是代码示例:

            var a1 = new int[10];
            var a2 = new int[1000000];

            #region init
            var random = new Random(12345);

            for (int i = 0; i < a1.Length; i++)
                a1[i] = random.Next(1000000000);

            for (int i = 0; i < a2.Length; i++)
                a2[i] = random.Next(1000000000);

            #endregion

            Console.WriteLine("a1 Length = " + a1.Length);
            var watcher = Stopwatch.StartNew();

            var t1 = a1[a1.Length / 2];

            watcher.Stop();
            Console.WriteLine("a1 timestamp = " + watcher.ElapsedTicks); // average value 130-150 ticks


            Console.WriteLine("a2 Length = " + a2.Length);
            watcher = Stopwatch.StartNew();

            var t2 = a2[a2.Length / 2];
            watcher.Stop();
            Console.WriteLine("a2 timestamp = " + watcher.ElapsedTicks); //average value 10 - 15 ticks


            Console.ReadLine();

我的结果是: -从长度为10的数组中的索引获取值约为130-150滴答 -从长度为1000000的数组中的索引获取值约为10-15个滴答声

1 个答案:

答案 0 :(得分:2)

我建议您更改衡量效果的方式,但是假设您的衡量是正确的。这可能是一些原因,其中之一是分支预测。简而言之,现代处理器将分支预测用于其计算。

on Wikipedia所示:

  

分支预测器的目的是改善分支中的流量   指令流水线。分支预测变量在以下方面发挥关键作用   在许多现代流水线中实现高效的性能   微处理器架构,例如x86。

因此,数字电路正在尝试识别模式并遵循该模式。如果您每次都猜对了,则执行将永远不会停止,而且运行会很快,如果您经常猜错,那么您将花费大量时间回滚并重新启动。出于同样的原因,处理排序数组比处理未排序数组要快。