64

对于算法的计时(大约以毫秒为单位),这两种方法中的哪一种更好:

clock_t start = clock();
algorithm();
clock_t end = clock();
double time = (double) (end-start) / CLOCKS_PER_SEC * 1000.0;

或者,

time_t start = time(0);
algorithm();
time_t end = time(0);
double time = difftime(end, start) * 1000.0;

此外,从 Freenode 的 C++ 频道的一些讨论中,我知道时钟的分辨率非常差,因此对于(相对)快速算法而言,时间将为零。但是,哪个具有更好的分辨率 time() 或 clock()?还是一样?

4

5 回答 5

58

<chrono>如果您使用的是 C++11,那将是一个更好的库。

#include <iostream>
#include <chrono>
#include <thread>

void f()
{
    std::this_thread::sleep_for(std::chrono::seconds(1));
}

int main()
{
    auto t1 = std::chrono::high_resolution_clock::now();
    f();
    auto t2 = std::chrono::high_resolution_clock::now();
    std::cout << "f() took "
              << std::chrono::duration_cast<std::chrono::milliseconds>(t2-t1).count()
              << " milliseconds\n";
}

示例取自这里

于 2012-09-01T20:42:20.113 回答
44

这取决于您想要什么:time测量实时时间,同时clock测量当前进程所花费的处理时间。如果您的进程休眠了相当长的时间,或者系统正忙于其他进程,那么两者将非常不同。

http://en.cppreference.com/w/cpp/chrono/c/clock

于 2012-09-01T20:42:13.460 回答
10

time_t 结构可能是一个整数,这意味着它的分辨率为秒。

第一段代码:它只会计算 CPU 做某事的时间,所以当你执行 sleep() 时,它不会计算任何东西。可以通过计算 sleep() 的时间来绕过它,但它可能会在一段时间后开始漂移。

第二部分:只有秒级的分辨率,如果您需要亚秒级时间读数,则不是很好。

对于您可以获得的最佳分辨率的时间读数,您应该执行以下操作:

double getUnixTime(void)
{
    struct timespec tv;

    if(clock_gettime(CLOCK_REALTIME, &tv) != 0) return 0;

    return (tv.tv_sec + (tv.tv_nsec / 1000000000.0));
}

double start_time = getUnixTime();
double stop_time, difference;

doYourStuff();

stop_time = getUnixTime();
difference = stop_time - start_time;

在大多数系统上,它的分辨率会下降到几微秒,但它会随着不同的 CPU 甚至主要内核版本而变化。

于 2012-09-01T20:46:31.003 回答
1

<chrono>是最好的。Visual Studio 2013 提供了此功能。就个人而言,我已经尝试了上面提到的所有方法。我强烈建议您使用该<chrono>库。它可以跟踪挂墙时间,同时具有良好的分辨率(远小于一秒)。

于 2014-12-08T01:46:50.213 回答
0

怎么样gettimeofday()?当它被调用时,它会使用时间信息更新两个结构(timevaltimezone)。通常,传递一个timeval结构就足够了,timezone结构可以设置为NULL. 更新后的timeval结构将有两个成员tv_sectv_usec. tv_sec是自 1970 年 1 月 1 日(Unix 纪元)00:00:00 以来的秒数,tv_usec是 wrt 的附加微秒数tv_sec。因此,可以得到以非常好的分辨率表示的时间。

它可以按如下方式使用:

#include <time.h>

struct timeval start_time;
double mtime, seconds, useconds;
gettimeofday(&start_time, NULL); //timeval is usually enough
int seconds  = start_time.tv_sec; //time in seconds
int useconds = start_time.tv_usec; //further time in microseconds
int desired_time = seconds * 1000000 + useconds; //time in microseconds
于 2015-06-01T09:16:33.010 回答