【问题标题】:How to clock_gettime within clock_getime?如何在clock_getime中获取clock_gettime?
【发布时间】:2017-02-27 19:36:19
【问题描述】:

假设我想测量特定功能的总时间。现在这个函数调用其他函数(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

我做错了吗?

【问题讨论】:

  • 调用clock_gettime需要一点时间,所以总时间自然会超过单个函数调用的时间。没有什么不对。如果你想避免这种情况,只需自己添加函数时间:计算函数时间之后,f_total_time = f1_total_time + f2_total_time;
  • 你用的是c++吗?
  • 不正确,但调用clock_gettime 需要时间!
  • @TonyD 我明白了,但f total time greater then f1 total time + f2 total time by factor of 100 , eg: 0.38 > 0.01 + 0.03
  • 我尝试并获得了连贯的结果...

标签: c++ performance time


【解决方案1】:

答案 -

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

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 的一部分并不是关于 功能实现......可以是任何语言, 甚至可以实现最佳性能。

【讨论】:

  • 我刚刚注意到您正在使用“CLOCK_MONOTONIC”。我只使用了 CLOCK_REALTIME。我认为我已经注意到的问题和 10 倍的想法仍然有效。
【解决方案2】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2013-08-31
    • 1970-01-01
    • 2013-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-19
    • 1970-01-01
    相关资源
    最近更新 更多