2015-11-19 6 views
4

Я пытаюсь время функции пустотПовторного выбор времени функции пустот в C++

for (size_t round = 0; round < 5; round++) { 
    cpu_time_start = get_cpu_time(); 
    wall_time_start = get_wall_time(); 

    scan.assign_clusters(epsilon, mu); 

    cpu_time_end = get_cpu_time(); 
    wall_time_end = get_wall_time(); 
    ... 
} 

Первая синхронизация дает 300 секунд, в то время как следующие четыре тайминги дают 0,000002 секунд. Это указывает на то, что функция функции void для функции assign_clusters оптимизирована. Как я могу заставить свою программу выполнять этот многозадачный вызов функции каждый раз и все же использовать оптимизацию для остальной части кода?

Что я обычно делаю, это сохранить результат этой функции, а затем распечатать ее, но поскольку это функция void, есть ли у меня такая же опция?

Я использую следующие флаги оптимизации: -std=c++0x -march=native -O2

+1

Он также может быть эффектом кэша. или лучшее предсказание ветвления в последующих прогонах. –

+4

Вы уверены, что 'assign_clusters' оптимизирован? Вы взглянули на код сборки? Не зная, что делает 'assign_clusters', это трудно ответить. Возможно, эта функция выполняется так быстро во второй раз, потому что вашей системе просто не нужно назначать кластеры дважды. – flowit

+0

Что произойдет, если вы скомпилируете свой код _without_ какой-либо оптимизации? –

ответ

2

Это зависит от того, что нашли время, чтобы сделать исправление.

Это может быть вызвано следующими причинами: -

  1. Загрузка услуг. Ваша кластеризация может основываться на базе данных и требует, чтобы службы баз данных запускались (в первый раз)
  2. Кэширование диска. ОС будет помнить данные, которые она прочитала, и иметь возможность предоставлять данные так, как если бы они были в памяти.
  3. Кэширование памяти. ЦПУ имеет разную скорость памяти, доступную для него, используя одну и ту же память дважды, будет быстрее во второй раз.
  4. Государство кэширование. Данные могут быть в более подходящем состоянии для последующих прогонов. Это можно рассматривать как сортировку массива дважды. Второй раз уже отсортирован, что может привести к ускорению.

Запуск службы может занять несколько секунд.

Кэш-память диска приблизительно 20 раз. Кэш памяти приблизительно 6 раз быстрее Государственное кэширование, может быть неограниченным.

Я думаю, что ваш код должен сбросить объект проверки, чтобы убедиться, что он делает работу снова

+0

Как указано в комментариях к вопросу, вы также правы. Объект сканирования не был сброшен. Тем не менее, я также рассмотрю проблему кэширования памяти, так как первая - это медленнее, чем следующие вызовы. – YnkDK