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

时间:2010-07-10 19:06:15

标签: c++ benchmarking clock

如何在clock()中致电C++

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

6 个答案:

答案 0 :(得分:191)

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

答案 1 :(得分:60)

从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

答案 2 :(得分:29)

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;

答案 3 :(得分:4)

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

答案 4 :(得分:0)

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

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

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

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

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

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

答案 5 :(得分:-1)

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

Linux OS中的代码:

public Dictionary<string, object> GetHierarchy(Dictionary<string, object> root, string path, string value)
{
    string[] parts = path.Split('.');
    if (parts.Length > 1)
    {
        if(!root.ContainsKey(parts[0]))
            root.Add(parts[0], new Dictionary<string, object>());
        Dictionary<string, object> dict = root[parts[0]] as Dictionary<string, object>;
        GetMe(dict, path.Replace(parts[0] + ".", string.Empty), value);
    }
    else 
        root[parts[0]] = value;
    return root;
}