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


127

我怎么叫clock()C++

例如,我要测试线性搜索在数组中找到给定元素所花费的时间。


1
请注意,挂钟时间并不总是计时微基准的好方法。为了获得一致的结果,您必须解决CPU频率缩放问题(包括Intel Turbo或AMD等效技术,当热量/功率限制允许时,CPU时钟会更高)。使用性能计数器进行性能分析可以为您提供核心时钟周期的度量值(还可以通过查看除周期以外的计数器来了解瓶颈是否是高速缓存未命中,指令吞吐量与延迟之间的关系)。在Linux上perf stat -d ./a.out
Peter Cordes

Answers:


207
#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
从我在这里看到的cplusplus.com/reference/ctime/clock,您不需要使用“ std ::”表示法。只需使用“ clock()”
gromit190 '16

4
@Birger:在我工作的所有项目中,代码风格在每次调用std ::之前都需要std ::。
Th。Thielemann

2
这会在几秒钟内返回答案吗?
阿尔纳夫·博尔博拉

1
@ArnavBorborah是的,确实如此。
QuantumHoneybees

1
@ Th.Thielemann clock()和@ clock_t均来自C标准库的标头time.h,因此std在包含它们的库之后不需要使用名称空间前缀。<ctime>std名称空间包装该值和函数,但不需要使用。在此处查看实施详情:en.cppreference.com/w/cpp/header/ctime
kayleeFrye_onDeck

70

自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

std::chrono::high_resolution_clock在所有标准库实现中不是单调的。从cppreference- 通常,应该只使用std :: chrono :: steady_clock或std :: chrono :: system_clock而不是std :: chrono :: high_resolution_clock:使用steady_clock进行持续时间测量,使用system_clock进行挂钟时间。
克里斯蒂安米特克

30

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为我而来。我该如何解决?
2013年

3
@noufal也许花费的时间很短,显示为0。您可以尝试使用a 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
#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"

这不会添加到已经回答的问题中。cl = clock()之后进入睡眠状态-不需要cl。并且cout打印秒数而不是每秒刻度。cl存储时钟滴答。
Yunke博士

0

也许您可能对这样的计时器感兴趣:H:M:S。毫秒

Linux OS中的代码:

#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秒?
Yunke博士

2
这将在时间上累积相对误差,因为您不包括打印所花费的时间,并且usleep不会总是在要求的数量之后返回。有时会更长。您应该在开始时检查当前时间,然后检查当前时间并减去以获取自每次循环开始以来的绝对时间。
彼得·科德斯

0

您可以衡量程序的运行时间。以下功能有助于测量自程序启动以来的CPU时间:

  • C ++(double)clock()/包括ctime的每秒时钟数。
  • python time.clock()以秒为单位返回浮点值。
  • Java System.nanoTime()返回以纳秒为单位的长值。

我的参考资料:算法工具箱第一周课程的数据结构和算法专业由加利福尼亚大学圣地亚哥分校和美国国立研究大学高等经济学院组成

因此您可以在算法之后添加此行代码

cout << (double)clock() / CLOCKS_PER_SEC ;

预期输出:代表数量的输出 clock ticks per second


1
问题是仅要求c ++。因此,很高兴您引用其他编程语言/脚本,但这是不合时宜的。
dboy
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.