Измерьте время выполнения вызова функции в C ++

Как я могу измерить время выполнения строки кода в C++in Windows. Я вставляю около 100 000 записей boost::multi_index_container следующим образом:

while(...) //read a single record from a csv file until EOF
{
    ...
    while(...) // split the record into components based on delimiter
    {
        ...
    }
    //insert into boost::multi_index_container
} 

Мне нужно найти время, необходимое для вставки всех записей, но без времени выполнения циклов. Запуск timer или чего-то еще непосредственно перед функцией вставки и вычисление прошедшего времени сразу после вызова функции дает в результате 0 nanoseconds. Поэтому я не могу рассчитать время, суммируя отдельные моменты времени. Каково решение?


person Jackzz    schedule 23.06.2016    source источник
comment
В принципе, вы можете решить это так: 1. Измерьте время пустого цикла (но убедитесь, что он не оптимизирован). 2. Измерьте время вашей вставной петли. 3. Возьмите разницу. Дьявол кроется в деталях: если вы хотите измерить, вы должны измерить оптимизированный код, а не отладить код. Кроме того, есть шанс, что оптимизатор усложнит вам задачу. Проверьте вывод ассемблера, чтобы убедиться, что вы измеряете то, что, по вашему мнению, измеряете. Поскольку вам также не нужно время чтения файла, вы можете придумать некоторые дополнительные шаги и отличия, чтобы наконец получить то, что вам нужно.   -  person BitTickler    schedule 23.06.2016
comment
Интересно, зачем вам это мерять?   -  person K117    schedule 23.06.2016
comment
@pradyot: мне нужно решение для системы Windows   -  person Jackzz    schedule 23.06.2016
comment
@BitTickler: Я попробую .. Но не уверен, что понял, что ты имел в виду ..   -  person Jackzz    schedule 23.06.2016
comment
@ K117: для измерения производительности   -  person Jackzz    schedule 23.06.2016
comment
@Jackzz. это очевидно. Зачем нужно измерять производительность?   -  person K117    schedule 23.06.2016
comment
Предложение: если вы хотите просто профилировать (т.е. это необходимо для разработчиков, а не для выпуска), используйте valgrind. Это измеряет тактовые циклы для вас.   -  person lorro    schedule 23.06.2016


Ответы (2)


В Windows вы можете получить точные измерения с помощью QueryPerformanceCounter.

person goobliata    schedule 23.06.2016
comment
QPC дает время выполнения как 0 для каждой отдельной вставки. Как я уже упоминал, мне нужно общее время выполнения, чтобы вставить записи размером в один миллион. - person Jackzz; 23.06.2016
comment
Возможно, вам понадобится как-то измерить циклы ЦП для чего-то более детального. - person goobliata; 23.06.2016
comment
Как я уже упоминал выше, если то, что вы хотите измерить, слишком мало, измерьте время, необходимое, чтобы сделать это несколько раз (так что это займет измеримое количество времени). Тогда волшебная операция - это деление: total_time / N, если N - количество раз, когда операция была выполнена. Поскольку ваш цикл и доступ к файлу также добавляют к total_time, вам нужны сравнительные прогоны одного и того же кода без операции вставки. Тогда (total_time - total_time_compare) / N. - person BitTickler; 26.06.2016

возможный дубликат Как рассчитать разницу во времени в C ++. Есть много способов сделать это. Тот, который мне нравится, использует хронограф.

   #include <iostream>
   #include <chrono>

   using namespace std;
   using namespace std::chrono;



   int main()
  {
    high_resolution_clock::time_point t1 = high_resolution_clock::now();
    //your code here
    high_resolution_clock::time_point t2 = high_resolution_clock::now();

    auto duration = duration_cast<microseconds>( t2 - t1 ).count();

    cout << duration;
    return 0;
  }
person Subrato Chakravorty    schedule 23.06.2016
comment
Время рассчитывается в микросекундах. - person Subrato Chakravorty; 23.06.2016
comment
Я уже пробовал ... снова он не даст время выполнения, исключая циклы - person Jackzz; 23.06.2016
comment
Он отлично работает на моем компьютере. Вы не возражаете, если я спрошу, что именно вы делаете? Вы пробовали другие методы, указанные в ссылке. - person Subrato Chakravorty; 24.06.2016