C# - 为什么这个循环的第一次迭代比其余循环慢?

时间:2011-05-11 02:44:30

标签: c# caching runtime benchmarking

我正在做一些基准测试来测试一些东西。我有一个大量的1亿64位整数,我随机选择了1000万个并进行了一些操作。索引是随机选择的,因为我试图尽可能地保持CPU缓存,同时仍然获得准确的基准。循环的第一次迭代大约需要0.3秒,其他所有循环只需要0.2秒。我唯一的猜测是,cone []的部分仍然在缓存中,但我认为使用这个大小的数组它将无法存储太多。还有其他想法吗?

也许是JIT问题?

static void Main(string[] args)
    {

        Int64[] cone = new Int64[100000001];

        for (int m = 0; m < 20; ++m)
        {
            int[] num2 = new int[10000001];
            Random rand = new Random();

            for (int i = 0; i < 10000000; ++i)
            {
                num2[i] = rand.Next(100000000);
            }

            DateTime start = DateTime.Now;

            for (int i = 0; i < 10000000; ++i)
            {
                cone[num2[i]] = i;
                if (cone[i] > 0) ++cone[i];

            }

            DateTime finish = DateTime.Now;
            TimeSpan elapsed = finish - start;

            Console.WriteLine("Took: {0}", elapsed);
            Thread.Sleep(100);
        }
        Console.ReadLine();
    }

1 个答案:

答案 0 :(得分:5)

可能是第一次点击循环时代码是Jitted。编译时间是什么让它变慢?我运行了你的代码的C ++版本,它似乎每次迭代都有相同的延迟。