Я предпочитаю обработку исключений, обсужденную в этой статье. Это приводит к чистому коду и избегает явного создания/удаления объектов только к исключениям процессов. http://www.informit.com/articles/article.aspx?p=373339
Чтобы иметь точность до миллисекунд, вы должны использовать системные вызовы, специфичные для вашей ОС.
В Linux вы можете использовать
#include <sys/time.h>
timeval tv;
gettimeofday(&tv, 0);
// then convert struct tv to your needed ms precision
timeval
с точностью до микросекунд.
В Windows вы можете можно использовать:
#include <Windows.h>
SYSTEMTIME st;
GetSystemTime(&st);
// then convert st to your precision needs
Конечно, вы можете использовать Boost , чтобы сделать это за вас :)
Вам нужен таймер с более высоким разрешением для захвата миллисекунд. Попробуйте следующее:
int cloc = clock();
//do something that takes a few milliseconds
cout << (clock() - cloc) << endl;
Это, конечно, зависит от вашей ОС.
Таймеры с высоким разрешением обычно - это gettimeofday на платформах в стиле Linux и QueryPerformanceCounter в Windows.
Вы должны знать, что определение продолжительности одной операции (даже с таймером с высоким разрешением) не даст точных результатов. Слишком много случайных факторов. Чтобы получить надежную информацию о времени, вы должны запустить задачу, рассчитанную по времени, в цикле и вычислить среднее время выполнения задачи. Для этого типа синхронизации должно быть достаточно функции clock ().
Если вы не хотите использовать какой-либо код, специфичный для ОС, вы можете использовать пакет ACE, который предоставляет функцию ACE_OS :: gettimeofday
для большинства стандартных операционных систем.
Например:
ACE_Time_Value startTime = ACE_OS::gettimeofday();
do_something();
ACE_Time_Value endTime = ACE_OS::gettimeofday();
cout << "Elapsed time: " << (endTime.sec() - startTime.sec()) << " seconds and " << double(endTime.usec() - startTime.usec()) / 1000 << " milliseconds." << endl;
Этот код будет работать независимо от вашей ОС (если ACE поддерживает эту ОС).