如何计算C ++中的时差

时间:2009-04-08 00:14:19

标签: c++

计算C ++时差的最佳方法是什么?我正在计算程序的执行速度,所以我对毫秒感兴趣。更好的是,秒。毫秒..

接受的答案有效,但需要包括ctime或time.h,如评论中所述。

13 个答案:

答案 0 :(得分:108)

请参阅std::clock()功能。

const clock_t begin_time = clock();
// do something
std::cout << float( clock () - begin_time ) /  CLOCKS_PER_SEC;

如果你想计算自己(不是用户)的执行时间,最好在时钟滴答(而不是秒)中执行此操作。

修改
负责的标题文件 - <ctime><time.h>

答案 1 :(得分:34)

如果您使用的是c ++ 11,这里有一个简单的包装器(请参阅此gist):

#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_;
};

或者对于* nix上的c ++ 03:

#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;
}

答案 2 :(得分:30)

我会认真考虑使用Boost,特别是boost :: posix_time :: ptime和boost :: posix_time :: time_duration(http://www.boost.org/doc/libs/1_38_0/doc/html/date_time/posix_time.html)。

它是跨平台的,易于使用,根据我的经验,它提供了操作系统提供的最高级别的时间分辨率。可能也非常重要;它提供了一些非常好的IO运营商。

要用它来计算程序执行的差异(到微秒;可能是矫枉过正),它看起来像这样[浏览器编写,未经过测试]:

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';

答案 3 :(得分:13)

提升1.46.0及以上包括Chrono库:

  

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";

答案 4 :(得分:13)

我添加了这个答案,以澄清已接受的answer显示的CPU时间可能不是您想要的时间。因为根据the reference,有 CPU时间和挂钟时间。挂钟时间是显示实际经过时间的时间,与其他任何条件(如其他进程共享的CPU)无关。例如,我使用多个处理器来执行某项任务,并且CPU时间高 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();

答案 5 :(得分:11)

在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;

}

答案 6 :(得分:8)

您也可以使用clock_gettime。此方法可用于衡量:

  1. 系统范围的实时时钟
  2. 系统范围的单调时钟
  3. 每个进程CPU时间
  4. 每个进程线程CPU时间
  5. 代码如下:

    #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";
    }
    

    `

答案 7 :(得分:6)

如果您使用的是Unix,可以使用time来获取执行时间:

$ g++ myprog.cpp -o myprog
$ time ./myprog

答案 8 :(得分:5)

请注意:如果您在Windows上运行,并且确实需要精确度,则可以使用QueryPerformanceCounter。它给你时间(可能)纳米秒。

答案 9 :(得分:4)

在开始时以毫秒为单位获取系统时间,在结束时再次获取系统时间,然后减去。

要获得POSIX中自1970年以来的毫秒数,您可以写:

struct timeval tv;

gettimeofday(&tv, NULL);
return ((((unsigned long long)tv.tv_sec) * 1000) +
        (((unsigned long long)tv.tv_usec) / 1000));

要获得自Windows 1601以来的毫秒数,您可以写:

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毫秒。但如果您关心的只是经过的时间,那就没有必要了。

答案 10 :(得分:4)

对我而言,最简单的方法是:

#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

享受您最喜欢的方法。

答案 11 :(得分:2)

如果您正在使用:

tstart = clock();

// ...do something...

tend = clock();

然后你需要以下几点来获得时间:

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

答案 12 :(得分:0)

这似乎适用于英特尔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;