Почему первая итерация этого цикла выполняется медленнее, чем остальные? - PullRequest
2 голосов
/ 11 мая 2011

Я делаю небольшой тест, чтобы что-то проверить. У меня большой массив из 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 Ответ

5 голосов
/ 11 мая 2011

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

...