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

Основная часть

В данной статье рассматривается библиотеки / из языков С /С++. По сути это одна и та же библиотека для разных языков. Чтобы работать со временем в программе на С++ надо подключить библиотеку, написав следующий код: #include . Напомним, что преследуемая цель – узнать продолжительность выполнения куска кода. За это отвечает функция clock(), имеющая такое определение:

clock_t clock( void );

Сlock() возвратит количество временных тактов с начала выполнения программы. В сигнатуре функции видно, что функция возвращает тип clock_t, который аналогичен типу long. Последнее легко проверяется, если посмотреть заголовочный файл, то мы найдем там строку «typedef long clock_t». Надо быть внимательным и следить за возвращаемым значением, потому что функция может вернуть -1. Такое возвращаемое число, как -1, означает, что невозможно получить системное время. Но это бывает крайне редко, и программист сам должен решить стоит ли ставить проверку или нет.

После возврата значения следует это значение поделить на макрос CLOCKS_PER_SEC. Сам макрос представляет собой константу равную значению 1000. Проделав следующую операцию, мы получим количество пройденных тактов за секунду: clock() / CLOCKS_PER_SEC. Нужно быть внимательным потому, что после деления мы получим целочисленный результат, а необходим вещественный. Поэтому нужно привести к типу double одну из двух операнд, а также вычесть предыдущее время, для того, чтобы узнать длительность выполнения. В итоге получится следующий кусочек кода:

clock_t beg_t; // Хранится начальное время

double end_t; // Хранится конечное время

beg_t = clock();

// код алгоритма

end_t = double(clock() - beg_t) / CLOCKS_PER_SEC;

cout << end_t << endl;

Нюансы при использовании функции clock:

  1. Вводить информацию промеж двумя вызовами clock() подобает только для тестирования своего консольного вывода или жесткого диска;
  2. Запрашивать внесение каких-либо данных с устройств ввода пользователей;
  3. Если при подсчете времени оказалось, что время равно 0, тогда процесс выполняется слишком быстро;
  4. Между двумя вызовами clock() не следует выделять динамически память для переменных, а также менять содержимое переменных, если эти переменные используются вне этого участка кода.

Приведенный метод замера длительности вычисления того или иного процесса довольно прост в реализации, но в то же самое время – не применим в случае сложных алгоритмов. Для сложных программ куда удобнее использовать профилировщики. Также не следует игнорировать приведенные советы, которые могу привести к весомой погрешности при подсчетах или даже к критически ошибкам.