Как рассчитать разницу во времени в C++
Как лучше всего рассчитать разницу во времени в C++? Я синхронизирую скорость выполнения программы, поэтому меня интересуют миллисекунды. А еще лучше, секунданты.миллисекунды..
принятый ответ работает, но должен включать ctime или time.h как отмечается в комментариях.
13 ответов:
посмотреть
std::clock()
Я бы серьезно рассмотрел использование Boost, особенно boost:: posix_time:: ptime и boost:: posix_time:: time_duration (at http://www.boost.org/doc/libs/1_38_0/doc/html/date_time/posix_time.html).
это кросс-платформенный, простой в использовании и, по моему опыту, обеспечивает самый высокий уровень разрешения времени, который обеспечивает операционная система. Возможно, также очень важно; он предоставляет некоторые очень хорошие операторы ввода-вывода.
чтобы использовать его для расчета разницы при выполнении программы (до микросекунд; вероятно, перебор) это будет выглядеть примерно так [браузер написан, не протестирован]:
ptime time_start(microsec_clock::local_time()); //... execution goes here ... ptime time_end(microsec_clock::local_time()); time_duration duration(time_end - time_start); cout << duration << '\n';
Если вы используете C++11, Вот простая бандероль (см. суть):
#include <iostream> #include <chrono> class Timer { public: Timer() : beg_(clock_::now()) {} void reset() { beg_ = clock_::now(); } double elapsed() const { return std::chrono::duration_cast<second_> (clock_::now() - beg_).count(); } private: typedef std::chrono::high_resolution_clock clock_; typedef std::chrono::duration<double, std::ratio<1> > second_; std::chrono::time_point<clock_> beg_; };
или для c++03 на *nix:
#include <iostream> #include <ctime> class Timer { public: Timer() { clock_gettime(CLOCK_REALTIME, &beg_); } double elapsed() { clock_gettime(CLOCK_REALTIME, &end_); return end_.tv_sec - beg_.tv_sec + (end_.tv_nsec - beg_.tv_nsec) / 1000000000.; } void reset() { clock_gettime(CLOCK_REALTIME, &beg_); } private: timespec beg_, end_; };
пример использования:
int main() { Timer tmr; double t = tmr.elapsed(); std::cout << t << std::endl; tmr.reset(); t = tmr.elapsed(); std::cout << t << std::endl; return 0; }
повышение 1.46.0 и выше включает в себя Хроно библиотека:
класс thread_clock обеспечивает доступ к реальному потоку настенных часов, т. е. реальные часы CPU-времени вызывающего потока. Нить относительная текущее время можно получить, вызвав thread_clock:: now ()
#include <boost/chrono/thread_clock.hpp> { ... using namespace boost::chrono; thread_clock::time_point start = thread_clock::now(); ... thread_clock::time_point stop = thread_clock::now(); std::cout << "duration: " << duration_cast<milliseconds>(stop - start).count() << " ms\n";
в Windows: используйте GetTickCount
//GetTickCount defintition #include <windows.h> int main() { DWORD dw1 = GetTickCount(); //Do something DWORD dw2 = GetTickCount(); cout<<"Time difference is "<<(dw2-dw1)<<" milliSeconds"<<endl; }
Я добавил этот ответ, чтобы уточнить, что принято ответ показывает время процессора, которое может быть не то время, которое вы хотите. Потому что согласно ссылка, есть время процессора и настенные часы время. Время настенных часов-это время, которое показывает фактическое затраченное время независимо от любых других условий, таких как процессор, совместно используемый другими процессами. Например, я использовал несколько процессоров для выполнения определенной задачи и время процессора был высоким. 18s где на самом деле взял 2s в реальном времени.
чтобы получить фактическое время вы
#include <chrono> auto t_start = std::chrono::high_resolution_clock::now(); // the work... auto t_end = std::chrono::high_resolution_clock::now(); double elaspedTimeMs = std::chrono::duration<double, std::milli>(t_end-t_start).count();
на всякий случай, если вы находитесь на Unix, вы можете использовать
time
чтобы получить время выполнения:$ g++ myprog.cpp -o myprog $ time ./myprog
вы также можете использовать clock_gettime. Этот метод может быть использован для измерения:
- системы реального времени
- Системные монотонные часы
- за процесс процессорного времени
- за процессорное время потока процесса
код выглядит следующим образом:
#include < time.h > #include <iostream> int main(){ timespec ts_beg, ts_end; clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &ts_beg); clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &ts_end); std::cout << (ts_end.tv_sec - ts_beg.tv_sec) + (ts_end.tv_nsec - ts_beg.tv_nsec) / 1e9 << " sec"; }
'
просто Примечание стороны: если вы работаете на Windows и вам действительно нужна точность, вы можете использовать QueryPerformanceCounter. Это дает вам время в (потенциально) наносекунд.
для меня, самый простой способ это:
#include <boost/timer.hpp> boost::timer t; double duration; t.restart(); /* DO SOMETHING HERE... */ duration = t.elapsed(); t.restart(); /* DO OTHER STUFF HERE... */ duration = t.elapsed();
используя этот кусок кода вам не нужно делать классический
end - start
.наслаждайтесь своим любимым подходом.
получить системное время в миллисекундах в начале, и снова в конце, и вычесть.
чтобы получить количество миллисекунд с 1970 года в POSIX вы бы написали:
struct timeval tv; gettimeofday(&tv, NULL); return ((((unsigned long long)tv.tv_sec) * 1000) + (((unsigned long long)tv.tv_usec) / 1000));
чтобы получить количество миллисекунд с 1601 года на Windows, вы бы написали:
SYSTEMTIME systime; FILETIME filetime; GetSystemTime(&systime); if (!SystemTimeToFileTime(&systime, &filetime)) return 0; unsigned long long ns_since_1601; ULARGE_INTEGER* ptr = (ULARGE_INTEGER*)&ns_since_1601; // copy the result into the ULARGE_INTEGER; this is actually // copying the result into the ns_since_1601 unsigned long long. ptr->u.LowPart = filetime.dwLowDateTime; ptr->u.HighPart = filetime.dwHighDateTime; // Compute the number of milliseconds since 1601; we have to // divide by 10,000, since the current value is the number of 100ns // intervals since 1601, not ms. return (ns_since_1601 / 10000);
если бы вы хотели нормализовать ответ Windows, чтобы он также возвращал количество миллисекунд с 1970 года, вам пришлось бы настроить свой ответ на 11644473600000 миллисекунд. Но это не обязательно, если все, что вас волнует, это прошедшее время.