C # — Почему первая итерация этого цикла выполняется медленнее остальных?

#c# #caching #runtime #benchmarking

#c# #кэширование #время выполнения #сравнительный анализ

Вопрос:

Я провожу небольшой сравнительный анализ, чтобы кое-что протестировать. У меня есть большой массив из 100 миллионов 64-битных целых чисел, я случайным образом выбираю 10 миллионов из них и выполняю несколько операций. Индексы выбираются случайным образом, потому что я пытаюсь не допустить, чтобы процессор кэшировал как можно больше, при этом все еще получая точный тест. Первая итерация цикла занимает около 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. Используйте Stopwatch класс.

2. @SLaks Я читаю о классе Stopwatch. Это просто более точно по сравнению с тем, что я делал с датой и временем?

3. Это, скорее всего, потому, что вы выделяете память на первой итерации. При повторных итерациях он будет продолжать использовать 64-разрядный массив int и перераспределять второй (гораздо меньший массив).

4. @pickypg Таймер не запускается до тех пор, пока все не будет выделено, если только типы значений не выделяются при объявлении (я почти уверен, что это так)

Ответ №1:

Возможно, код Jitted при первом запуске цикла. Время компиляции — это то, что делает его медленным? Я запустил версию вашего кода на C , и, похоже, у нее примерно одинаковая задержка для каждой итерации.

Комментарии:

1. Это хорошая идея, мне следовало попробовать это и на C . Если нет разницы с C , то, вероятно, это проблема JIT. Это небольшой фрагмент кода, я полагал, что все это будет просто запущено при запуске.