【问题标题】:How to use clock() in C++如何在 C++ 中使用时钟()
【发布时间】:2011-03-14 07:47:21
【问题描述】:

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

例如,我想测试线性搜索需要多长时间才能找到数组中的给定元素。

【问题讨论】:

  • 请注意,挂钟时间并不总是对微基准进行计时的好方法。要获得一致的结果,您必须解决 CPU 频率缩放问题(包括 Intel turbo 或 AMD 同等产品,当热量/功率限制允许时,它可以让您的 CPU 时钟更高)。使用性能计数器进行分析可以为您提供核心时钟周期的测量值(以及关于瓶颈是否是缓存未命中、指令吞吐量和延迟的详细信息,通过查看计数器而不是周期)。在 Linux 上,perf stat -d ./a.out

标签: c++ benchmarking clock


【解决方案1】:
#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';
}

【讨论】:

  • 从我在这里看到的cplusplus.com/reference/ctime/clock,你不需要使用“std::”符号。只需使用“时钟()”
  • @Birger:在我工作的所有项目中,代码风格需要 std:: 在每个 std:: 调用之前。
  • 这会在几秒钟内返回答案吗?
  • @ArnavBorborah 是的,确实如此。
  • @Th.Thielemann clock()clock_t 都来自 C 标准库的标头 time.h,因此在包含它们之后不需要使用 std 命名空间前缀图书馆。 &lt;ctime&gt; 将该值和函数与 std 命名空间一起包装,但它不是必须使用的。在此处查看实施细节:en.cppreference.com/w/cpp/header/ctime
【解决方案2】:

另一种解决方案是使用std::chrono,可移植且精度更高,自 C++11 起可用。

这是一个例子:

#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

【讨论】:

  • 如果你建议使用C++11,你也可以写using Clock=std::chrono::high_resolution_clock;。见type alias
  • std::chrono::high_resolution_clock 在所有标准库实现中都不是单调的。从 cppreference - 通常应该直接使用 std::chrono::steady_clock 或 std::chrono::system_clock 而不是 std::chrono::high_resolution_clock:使用 stable_clock 进行持续时间测量,使用 system_clock 进行挂钟时间。
【解决方案3】:

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;

【讨论】:

  • timeInSeconds 总是为我而来0.000000。我将如何解决它?
  • @noufal 可能花费的时间太短,显示为 0。您可以尝试使用 long double 以获得更高的精度。
  • 可能你的时钟分辨率不够高,所以没有经过时间。
【解决方案4】:

至少在 Windows 上,唯一实际准确的测量机制是 QueryPerformanceCounter (QPC)。 std::chrono 是使用它实现的(从 VS2015 开始,如果你使用它的话),但它与直接使用 QueryPerformanceCounter 的准确度相同。特别是它声称以 1 纳秒的粒度报告是绝对不正确的。所以,如果你测量的东西需要很短的时间(你的情况可能就是这种情况),那么你应该使用 QPC,或者你的操作系统的等价物。我在测量缓存延迟时遇到了这个问题,我在这里记下了一些你可能会觉得有用的笔记; https://github.com/jarlostensen/notesandcomments/blob/master/stdchronovsqcp.md

【讨论】:

    【解决方案5】:
    #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 存储时钟滴答声。
    【解决方案6】:

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

    • C++ (double)clock() / CLOCKS_PER_SEC 包含 ctime
    • Python time.clock() 以秒为单位返回浮点值。
    • Java System.nanoTime() 以纳秒为单位返回 long 值。

    我的参考:算法工具箱第 1 周课程部分数据结构和算法专业化加州大学圣地亚哥分校和国立研究大学高等经济学院

    所以你可以在你的算法之后添加这行代码:

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

    预期输出:表示clock ticks per second个数的输出

    【讨论】:

    • 问题只针对 c++。所以很高兴您参考其他编程语言/脚本,但这超出了主题。
    【解决方案7】:

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

    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 秒?
    • 这会在时间上累积相对误差,因为您不包括打印所需的时间,并且usleep 不会总是在您要求的数量之后返回。有时会更长。您应该在开始时检查当前时间,然后检查当前时间并减去以获取自每次循环开始以来的绝对时间。
    猜你喜欢
    • 2011-10-29
    • 2011-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多