【问题标题】:Measuring time taken by a function: clock_gettime测量函数花费的时间:clock_gettime
【发布时间】:2010-10-15 23:24:15
【问题描述】:

我正在尝试测量一个函数需要多长时间。

我有一个小问题:虽然我试图精确并使用浮点数,但每次我使用 %lf 打印我的代码时,我都会得到以下两个答案之一:1.000... 或 0.000。 .. 这让我怀疑我的代码是否正确:

#define BILLION  1000000000L;

// Calculate time taken by a request
struct timespec requestStart, requestEnd;
clock_gettime(CLOCK_REALTIME, &requestStart);
function_call();
clock_gettime(CLOCK_REALTIME, &requestEnd);

// Calculate time it took
double accum = ( requestEnd.tv_sec - requestStart.tv_sec )
  + ( requestEnd.tv_nsec - requestStart.tv_nsec )
  / BILLION;
printf( "%lf\n", accum );

大部分代码不是我编写的。此示例页面的代码说明了 clock_gettime 的用法:

谁能告诉我什么是不正确的,或者为什么我只能得到int 值?

【问题讨论】:

  • 不,不,不:不要给数字起名字。改用他们提供的功能:#define CLOCK_PRECISION 1000000000L /* one billion */
  • @pmg: Pedantry tangent:我认为只有当变量名称中的单位不明确时,才需要使用诸如 CLOCK_PRECISION 这样的名称。在上面的例子中,从名称tv_nsec 可以清楚地看出我们在纳秒内。所以NANOSECONDS_PER_SECOND 可能是合适的,但这与简单的BILLION 并没有太大的不同。
  • CLOCK_REALTIME 受系统时间不连续跳转的影响。考虑使用CLOCK_MONOTONIC_RAW——它不受adjtime()的时间调整和时间跳跃的影响。

标签: c timing clock


【解决方案1】:

一个整数除以一个整数得到一个整数。试试这个:

#define BILLION 1E9

并且不要在行尾使用分号。 #define 是预处理器指令,而不是语句,包含分号导致 BILLION 被定义为 1000000000L;,如果您尝试在大多数情况下使用它会中断。你很幸运,因为你在表达式的最后和任何括号之外使用了它。

【讨论】:

  • 非常感谢您的帮助。感谢您让我知道分号,这是我忘记的。非常感谢!
  • 为了性能.. #define ONE_OVER_BILLION 1E-9 并使用乘法。
【解决方案2】:

( requestEnd.tv_nsec - requestStart.tv_nsec )是整数类型,总是小于BILLION,所以整数运算中一个除以另一个的结果总是0。您需要将减法的结果转换为例如double 在进行除法之前。

【讨论】:

    【解决方案3】:

    请注意,(requestEnd.tv_nsec - requestStart.tv_nsec) 可以为负数,在这种情况下,您需要从 tv_sec 差异中减去 1 秒,然后在 tv_nsec 差异中添加 10 亿。

    【讨论】:

    • 投反对票,因为答案不正确。在类似的计算中,可能需要这样的东西,但这里不是。如果requestEnd.tv_nsec - requestStart.tv_nsec 是负数,而BILLION 是双倍1E9,那么(requestEnd.tv_nsec - requestStart.tv_nsec) / BILLION 将是-1.00.0 之间的双倍,并且将此数字添加到(requestEnd.tv_sec - requestStart.tv_sec) 将做正确的事情,因为后者被隐式转换为双精度。 en.cppreference.com/w/c/language/conversion
    【解决方案4】:

    我知道问题是很久以前发布的,但我仍然看不到建议您将经过的时间“转换”为纳秒(或毫秒)而不是代码示例中的秒的答案。

    说明这个想法的示例代码片段:

    long long accum = ( requestEnd.tv_nsec - requestStart.tv_nsec )
     + ( requestEnd.tv_sec - requestStart.tv_sec ) * BILLION;
    

    这样可以避免浮点运算,这对于某些平台来说可能很繁重...

    【讨论】:

    • 应该是/ BILLION,而不是* BILLION
    • @FractalSpace ,通过乘法我们将秒转换为纳秒。
    • 对。 accum 的单位是 ns,而 OP 的单位是 sec
    猜你喜欢
    • 2010-12-13
    • 2014-05-25
    • 1970-01-01
    • 2010-09-23
    • 2020-09-23
    • 1970-01-01
    • 1970-01-01
    • 2016-03-26
    相关资源
    最近更新 更多