如何在C++中使用clock()函数

140

我该如何在 C++ 中调用 clock() 函数?

例如,我想测试线性查找在一个数组中找到给定元素所需的时间。


1
请注意,挂钟时间并不总是衡量微基准测试的好方法。为了获得一致的结果,您必须解决CPU频率缩放问题(包括英特尔turbo或AMD等效技术,它可以在热/功率限制允许时使CPU时钟更高)。使用性能计数器进行分析可以给您提供核心时钟周期的测量值(还可以通过查看除周期以外的计数器来获取有关瓶颈是缓存未命中还是指令吞吐量还是延迟的详细信息)。在Linux上,perf stat -d ./a.out - Peter Cordes
7个回答

221
#include <iostream>
#include <cstdio>
#include <ctime>

int main() {
    std::clock_t start;
    double duration;

    start = std::clock();

    /* Your algorithm here */

    duration = ( std::clock() - start ) / (double) CLOCKS_PER_SEC;

    std::cout<<"printf: "<< duration <<'\n';
}

5
根据我在http://www.cplusplus.com/reference/ctime/clock/上的观察,您不需要使用“std::”符号。只需使用“clock()”即可。 - birgersp
4
在我参与的所有项目中,代码风格要求在每个std::调用前都要加上std::。 - Th. Thielemann
3
这个返回的答案是以秒为单位吗? - Arnav Borborah
1
@ArnavBorborah 是的,它确实如此。 - JoeVictor
1
@Th.Thielemann clock()clock_t都来自于C标准库的time.h头文件,因此在包含它们的库后不需要使用std命名空间前缀。 <ctime>将该值和函数与std命名空间一起封装,但不需要使用。请在此处查看实现细节:http://en.cppreference.com/w/cpp/header/ctime - kayleeFrye_onDeck
显示剩余3条评论

78

自 C++11 开始,一种可移植且精度更高的替代方案是使用 std::chrono

以下是一个示例:

#include <iostream>
#include <chrono>
typedef std::chrono::high_resolution_clock Clock;

int main()
{
    auto t1 = Clock::now();
    auto t2 = Clock::now();
    std::cout << "Delta t2-t1: " 
              << std::chrono::duration_cast<std::chrono::nanoseconds>(t2 - t1).count()
              << " nanoseconds" << std::endl;
}

在 ideone.com 上运行此代码返回以下结果:
Delta t2-t1: 282 nanoseconds

11
如果您建议使用 C++11,那么您可以写成 using Clock=std::chrono::high_resolution_clock;。请参考 类型别名 - JHBonarius
1
std::chrono::high_resolution_clock 在所有的 std 库实现中都不是单调的。根据 cppreference - 一般情况下,我们应直接使用 std::chrono::steady_clockstd::chrono::system_clock 而非 std::chrono::high_resolution_clock:对于时间间隔的测量,请使用 steady_clock,对于挂钟时间,请使用 system_clock - Kristianmitk

33

clock()函数返回程序开始运行以来的时钟计数器值。还有一个相关的常量CLOCKS_PER_SEC,它告诉你一秒钟内有多少个时钟计数器滴答声。因此,你可以像这样测试任何操作:

clock_t startTime = clock();
doSomeOperation();
clock_t endTime = clock();
clock_t clockTicksTaken = endTime - startTime;
double timeInSeconds = clockTicksTaken / (double) CLOCKS_PER_SEC;

6
我的 timeInSeconds 总是显示为 0.000000,我该如何修复它? - noufal
3
也许所花费的时间非常短,以至于显示为0。您可以尝试使用“long double”来获得更高的精度。 - Gerard
可能是您的时钟分辨率不够高,因此没有经过足够的时间。 - Marco Freudenberger

4
至少在Windows系统上,唯一实际精确测量机制是QueryPerformanceCounter(QPC)。std::chrono是使用它实现的(如果您使用VS2015),但它的精度不如直接使用QueryPerformanceCounter。特别是它声称以1纳秒粒度报告的说法绝对不正确。因此,如果您正在测量非常短的时间(您的情况可能正是这种情况),则应使用QPC或适用于您的操作系统的等效方法。当我测量缓存延迟时,我遇到了这个问题,并记下了一些你可能会发现有用的笔记,参见: https://github.com/jarlostensen/notesandcomments/blob/master/stdchronovsqcp.md

0

也许您对这样的计时器感兴趣:

H:M:S.Msec。

在Linux操作系统中的代码:

#include <iostream>
#include <unistd.h>

using namespace std;
void newline(); 

int main() {

int msec = 0;
int sec = 0;
int min = 0;
int hr = 0;


//cout << "Press any key to start:";
//char start = _gtech();

for (;;)
{
        newline();
                if(msec == 1000)
                {
                        ++sec;
                        msec = 0;
                }
                if(sec == 60)
                {
                        ++min;
                        sec = 0; 
                }
                if(min == 60)
                {
                        ++hr;
                        min = 0;
                }
        cout << hr << " : " << min << " : " << sec << " . " << msec << endl;
        ++msec;
        usleep(100000); 

}

    return 0;
}

void newline()
{
        cout << "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n";
}

你可能想要检查第一个条件... 10毫秒=1秒? - Ricardo González
2
这将在时间上累积相对误差,因为您没有包括打印所需的时间,并且 usleep 不总是在您要求的确切时间后返回。有时它会更长。您应该在开始时检查当前时间,然后检查当前时间并减去每次循环通过的绝对时间,以获取自启动以来的绝对时间。 - Peter Cordes

0
#include <iostream>
#include <ctime>
#include <cstdlib> //_sleep()  --- just a function that waits a certain amount of milliseconds

using namespace std;

int main()
{

    clock_t cl;     //initializing a clock type

    cl = clock();   //starting time of clock

    _sleep(5167);   //insert code here

    cl = clock() - cl;  //end point of clock

    _sleep(1000);   //testing to see if it actually stops at the end point

    cout << cl/(double)CLOCKS_PER_SEC << endl;  //prints the determined ticks per second (seconds passed)


    return 0;
}

//outputs "5.17"

1
这不会对已回答的问题造成任何影响。在 cl = clock() - cl 之后休眠是不必要的。cout 打印的是秒数而不是每秒钟的时钟周期数。cl 存储时钟周期数。 - Ricardo González

0
您可以测量程序的运行时间。以下函数帮助测量自程序启动后的 CPU 时间:
  • C++ 中,(double)clock() / CLOCKS_PER_SEC,需要包含 ctime
  • Python 中,time.clock() 以浮点数返回秒数。
  • Java 中,System.nanoTime() 以纳秒返回长整型数值。
我的参考资料:加州大学圣地亚哥分校和俄罗斯国家高等经济大学开设的数据结构与算法专项课程中算法工具箱第一周。
因此,在您的算法后添加这行代码即可:
cout << (double)clock() / CLOCKS_PER_SEC;

预期输出: 表示每秒钟的时钟滴答数的输出


1
这个问题只涉及到C++,所以虽然你提到其他编程语言/脚本很好,但它不属于这个话题。 - dboy

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