在C++中测量CPU时间

18
如果我有以下代码
clock_t t;
t = clock();
//algorithm
t = clock() - t;

这个数值等于运行程序所需的时钟周期数。这与CPU时间相同吗?在C++中是否有其他测量CPU时间的方法?

操作系统 - Debian GNU/Linux 我可以接受任何可行的方法。我想比较两种算法的CPU时间。


请澄清您是寻找C/C++标准和可移植方法,还是接受操作系统库和CPU特定的机器指令。 - Zan Lynx
这个问题肯定是重复的。 - Zan Lynx
4个回答

23

clock()被指定用于测量CPU时间,但并非所有实现都是如此。特别是Microsoft的VS中的实现在多个线程运行时不会计算额外时间,或者在程序的线程处于睡眠/等待状态时计算更少时间。

还要注意,clock()应该测量整个程序所使用的CPU时间,因此尽管多个线程在//algorithm中使用的CPU时间将被测量,但不属于//algorithm的其他线程也会被计算。

clock()是标准中指定的唯一测量CPU时间的方法,但肯定有其他平台特定的方法来测量CPU时间。

std::chrono不包括任何用于测量CPU时间的时钟。它仅有一个与系统时间同步的时钟,一个相对于真实时间以稳定速率前进的时钟和一个“高分辨率”时钟,但不一定测量CPU时间。


这很有帮助,但你能告诉我们在哪里搜索Windows特定的测量CPU时间的方法吗? - LovelyHanibal

9

如何测量 CPU 使用时间?

#include <ctime>

std::clock_t c_start = std::clock();
// your_algorithm
std::clock_t c_end = std::clock();

long_double time_elapsed_ms = 1000.0 * (c_end-c_start) / CLOCKS_PER_SEC;
std::cout << "CPU time used: " << time_elapsed_ms << " ms\n";

当然,如果您以秒为单位显示时间:
std::cout << "CPU time used: " << time_elapsed_ms / 1000.0 << " s\n";

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

这是一个关于C++中的时钟函数的文档。时钟函数提供了程序运行时间的信息,可以用来计算程序执行时间或者进行时间测量。它们在多线程环境下也非常有用。


2

使用pthread的非标准方法如下:

#include <pthread.h>
#include <time.h>

timespec cpu_time()
{
    thread_local bool initialized(false);
    thread_local clockid_t clock_id;

    if (!initialized)
    {
        pthread_getcpuclockid(pthread_self(), &clock_id);
        initialized = true;
    }

    timespec result;
    clock_gettime(clock_id, &result);
    return result;    
}

补充说明:更标准的做法是:

#include <sys/resource.h>
#include <stdio.h>

int main(int argc, char* argv[])
{
    struct rusage r;

    getrusage(RUSAGE_SELF, &r);

    printf("CPU usage: %d.%06d\n", r.ru_utime.tv_sec, r.ru_utime.tv_usec);
}

0

5
值得注意的是,chrono 库是 C++11 标准的一部分。 - NicholasM
10
chrono 不测量 CPU 时间。 - user9414424

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接