【问题标题】:Measuring execution time with clock in sec in C not working在C中以秒为单位测量执行时间不起作用
【发布时间】:2016-09-13 08:30:18
【问题描述】:

我正在尝试在 linux 下使用 clock() 测量 C 中的执行时间:

#include <time.h>
#include <stdio.h>
#include <unistd.h>

int main(int argc, char const* argv[])
{
  clock_t begin, end;
  begin = clock();
  sleep(2);
  end = clock();
  double spent = ((double)(end-begin)) / CLOCKS_PER_SEC;
  printf("%ld %ld, spent: %f\n", begin, end, spent);
  return 0;
}

输出是:

1254 1296, spent: 0.000042

文档说将时钟时间除以 CLOCKS_PER_SEC 以获得以秒为单位的执行时间,但这对于 2 秒 sleep 来说似乎非常不正确。

有什么问题?

【问题讨论】:

  • %f 用于double,仅供参考。
  • @SouravGhosh 是的,就像变量 time_spent 一样。
  • @SouravGhosh,C 可变参数函数会自动执行某些提升。其中之一是从浮动到双。将 %f 用于浮点数并不是最优的,但也不是完全错误。带有 %d 的打印字符也是如此。
  • @ShacharShemesh 你错过了前两个格式说明符吗?
  • @SouravGhosh,我显然不明白你的意思。我以为是他将 %f 用于浮点类型,但他没有。他用两个 %ld 打印两个有符号的 long(应该如此),用 %f 打印一个 double (再次正确)。我不明白您的预订是什么。

标签: c linux unix time clock


【解决方案1】:

睡眠几乎不需要执行时间。程序只需要安排它的唤醒时间,然后让自己进入睡眠状态。当它处于睡眠状态时,它并没有执行。当它醒来时,它根本不需要做任何事情。这一切只需要一秒钟的时间。

睡眠时间更长并不需要更多的执行时间。因此,程序没有执行的时间为 2 秒这一事实没有任何影响。

【讨论】:

  • 好的,谢谢,我如何测量睡眠时间?这正是我所需要的。
  • @NicolasScottoDiPerto 您可以使用clock_gettime 和CLOCK_MONOLITHIC 获取当前时间;这将像您期望的那样工作(请记住,这是 POSIX 的事情;在 Windows 上,如果您需要可移植性,您可以使用 GetTickCount 或 QueryPerformanceCounter)。
【解决方案2】:

clock 测量 CPU 时间(至少在 Linux 中)。休眠进程不消耗 CPU 时间。

如果您想像使用秒表一样测量时间间隔,无论您的进程在做什么,请使用 clock_gettime 和 CLOCK_MONOTONIC。

【讨论】:

  • 谢谢你这正是我最初需要的。
【解决方案3】:

man clock()有答案:

The clock() function returns an approximation of processor time used by the program.

这清楚地表明clock() 返回程序使用的处理器时间,而不是您通常使用gettimeofday 完成的程序总运行时间的预期。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-30
    • 2016-12-14
    • 2022-06-28
    • 2019-01-09
    • 1970-01-01
    • 2011-12-26
    • 2010-09-26
    相关资源
    最近更新 更多