时序算法:C ++中的clock()vs time()

时间:2012-09-01 20:33:36

标签: c++ clock timing

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

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()?或者它是一样的吗?

5 个答案:

答案 0 :(得分:44)

如果您使用的是C ++ 11,

<chrono>将是一个更好的库。

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

取自here

的示例

答案 1 :(得分:41)

这取决于您的需求:time衡量实时,clock衡量当前流程的处理时间。如果您的进程在任何可观的时间内休眠,或者系统正在忙于其他进程,那么这两者将会非常不同。

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

答案 2 :(得分:9)

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

第一段代码:它只会计算CPU执行某些操作的时间,因此当您执行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的不同而不同,甚至可能是主要内核版本。

答案 3 :(得分:1)

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

答案 4 :(得分:0)

gettimeofday怎么样?当它被调用时,它会更新两个结构,并带有计时信息。通常,左手结构就足够了,自从Epoch,01-01-1970 00:00:00(UTC)起,它将携带时间。它可以使用如下:

#include <time.h>

struct timeval start;
double mtime, seconds, useconds;
gettimeofday(&start, NULL); //left hand struct is usually enough
seconds  = start.tv_sec; //time in seconds
useconds = start.tv_usec; //time in microseconds