#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. Это небольшой фрагмент кода, я полагал, что все это будет просто запущено при запуске.