Как рассчитать разницу во времени в C++


Как лучше всего рассчитать разницу во времени в C++? Я синхронизирую скорость выполнения программы, поэтому меня интересуют миллисекунды. А еще лучше, секунданты.миллисекунды..

принятый ответ работает, но должен включать ctime или time.h как отмечается в комментариях.

13 75
c++

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. Этот метод может быть использован для измерения:

  1. системы реального времени
  2. Системные монотонные часы
  3. за процесс процессорного времени
  4. за процессорное время потока процесса

код выглядит следующим образом:

#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 миллисекунд. Но это не обязательно, если все, что вас волнует, это прошедшее время.

Если вы используете:

tstart = clock();

// ...do something...

tend = clock();

тогда вам потребуется следующее, Чтобы получить время в секундах:

time = (tend - tstart) / (double) CLOCKS_PER_SEC;

это, кажется, работает нормально для intel Mac 10.7:

#include <time.h>

time_t start = time(NULL);


    //Do your work


time_t end = time(NULL);
std::cout<<"Execution Time: "<< (double)(end-start)<<" Seconds"<<std::endl;