如何在clock_getime内clock_gettime?

时间:2017-02-27 19:36:19

标签: c++ performance time

让我们说我想衡量一个特定功能的总时间。现在这个函数调用其他函数(f1和f2)。所以我想计算f1和f2的总时间。

我期待的是f total time = f1 total time + f2 total time

void f(){
    struct timespec total_start, total_end;
    struct timespec f1_start, f1_end;
    struct timespec f2_start, f2_end;

    clock_gettime(CLOCK_MONOTONIC, &total_start);

        clock_gettime(CLOCK_MONOTONIC, &f1_start);
        f1();
        clock_gettime(CLOCK_MONOTONIC, &f1_end);

        clock_gettime(CLOCK_MONOTONIC, &f2_start);
        f2();
        clock_gettime(CLOCK_MONOTONIC, &f2_end);

    clock_gettime(CLOCK_MONOTONIC, &total_end);

    f_total_time = (total_end.tv_sec - total_start.tv_sec) + (total_end.tv_nsec - total_start.tv_nsec)/1e9 ;

    f1_total_time = (f1_end.tv_sec - f1_start.tv_sec) + (f1_end.tv_nsec - f1_start.tv_nsec)/1e9 ;

    f2_total_time = (f2_end.tv_sec - f2_start.tv_sec) + (f2_end.tv_nsec - f2_start.tv_nsec)/1e9 ;
}

我的问题是,这是衡量函数内部函数时间的正确方法吗?

问题:我面临的问题是f1的总时间,而f2不等于f的总时间。即f total time != f1 total time + f2 total time实际发生的是f total time > f1 total time + f2 total time

我做错了吗?

2 个答案:

答案 0 :(得分:0)

要计算C ++应用程序,请记录变量中的初始时间,并声明持续时间(秒):

#include "time.h"
clock_t t (clock ());
size_t duration (0);

在执行期间,持续时间以这种方式更新:

duration = (clock() - t)/CLOCKS_PER_SEC;

答案 1 :(得分:0)

回答 -

是。恕我直言,它似乎是一种有效的持续时间测量技术 函数中的函数。

Posix clock_gettime()报告固定的秒/纳秒 时间,所以每次访问都是独立的。

来自" man clock_gettime" :

所有实现都支持系统范围的实时时钟,    由CLOCK_REALTIME标识。它的时间代表着    自纪元以来的秒和纳秒。什么时候到了    改变了,相对间隔的计时器不受影响,但是    绝对时间点的计时器会受到影响。

我认为你的做法没有错。

也许你需要了解更多关于你的相对持续时间的信息 代码与您正在使用的时钟读取机制的持续时间。

在我的Ubuntu 15.10上,在较旧的戴尔上,使用g ++ 5.2.1,Posix 调用

clock_gettime(CLOCK_REALTIME, ...) 

使用> 1,500 ns(平均3秒)(即约1.5 us)

为了达到一定程度的重复性,你的持续时间 试图测量(f1()和f2()和f1()+ f2())必须大于 这可能是10倍。

您的系统将与我的系统不同,因此您必须对其进行测试 知道这些时钟读取需要多长时间。

还有一个有趣的想法,知道有多快 CLOCK_REALTIME递增。即使API指示 纳秒,它可能不会那么快。

我使用的替代方法是std :: time(nullptr),成本约为5 ns(在我的系统上),减少3个数量级。仅供参考::: time(0)测量相同。

由此API返回控制的循环最后才会启动 一秒钟,当返回的值从以前改变时 值。我通常累积3秒的循环(即固定的 测试时间)并计算平均事件持续时间。

测量输出示例:

751.1412070 M  'std::time(nullptr) duration' invocations in 3.999,788 sec   (3999788 us)
187.7952549 M  'std::time(nullptr) duration' events per second
5.324948176 n seconds per 'std::time(nullptr) duration' event

如果使用此时钟访问,您可以简单地减去5.3 ns(在我的 系统)从每次调用时计算每个事件的秒数 你的职能。

注意:任何Posix API都是提供的系统的接口 功能,而不是功能本身。

成为API的一部分并不是关于该问题的确凿证据 函数实现...可以是任何语言, 甚至可以达到最佳性能。