【问题标题】:Does `clock` measure `sleep` i.e. suspended threads?`clock` 是否测量 `sleep` 即暂停的线程?
【发布时间】:2021-06-17 16:03:48
【问题描述】:

我正在尝试更好地理解 clock_t clock(void); 函数并有以下问题:

我是否正确理解clock 测量进程的滴答数,因为它正在运行 并且sleep 暂停调用线程——在这种情况下只有一个线程,即主线程——因此暂停整个进程。这意味着clock 不会测量进程的 CPU 时间(滴答声),因为它没有主动运行?
如果是这样,测量实际所需时间的推荐方法是什么?

clock() 函数返回程序使用的处理器时间的近似值。” Source
“CPU 时间(进程时间)以时钟滴答或秒为单位测量。” Source
"每秒时钟滴答数可以使用:sysconf(_SC_CLK_TCK);"Source获得

#include <stdio.h>  // printf
#include <time.h>   // clock
#include <unistd.h> // sleep

int main()
{
  printf("ticks per second: %zu\n", sysconf(_SC_CLK_TCK));

  clock_t ticks_since_process_startup_1 = clock();
  sleep(1);
  clock_t ticks_since_process_startup_2 = clock();

  printf("ticks_probe_1:    %zu\n", ticks_since_process_startup_1);
  printf("sleep(1);\n");
  printf("ticks_probe_2:    %zu\n", ticks_since_process_startup_2);
  printf("ticks diff:       %zu <-- should be 100\n", ticks_since_process_startup_2 - ticks_since_process_startup_1);
  printf("ticks diff sec:   %Lf <-- should be 1 second\n", (long double)(ticks_since_process_startup_2 - ticks_since_process_startup_1) / CLOCKS_PER_SEC);
  return 0;
}

结果输出:

ticks per second: 100
ticks_probe_1:    603
sleep(1);
ticks_probe_2:    616
ticks diff:       13 <-- should be 100
ticks diff sec:   0.000013 <-- should be 1 second

【问题讨论】:

    标签: c sleep clock


    【解决方案1】:

    clock 是否测量 sleep 即暂停的线程?

    没有。

    (嗯,它可以测量它,没有什么反对它。你可能有一个非常糟糕的操作系统,将sleep() 实现为while (!time_to_sleep_expired()) {} 繁忙循环。但是任何自尊的操作系统都会试图让这个过程不在sleep() 时使用 CPU。

    这意味着时钟没有测量进程的 cpu 时间(滴答声),因为它没有主动运行?

    是的。

    如果是这样,测量实际所需时间的推荐方法是什么?

    要测量“实时”,请在 POSIX 系统上使用 clock_gettime(CLOCK_MONOTONIC, ...)

    每秒时钟滴答数可以使用:sysconf(_SC_CLK_TCK);

    是的,但请注意sysconf(_SC_CLK_TCK); 不是 CLOCKS_PER_SECOND。你没有在你的函数中使用前times(),你使用clock(),我真的不明白你为什么打印sysconf(_SC_CLK_TCK);。无论如何,请参阅例如 sysconf(_SC_CLK_TCK) vs. CLOCKS_PER_SEC

    【讨论】:

    • 我明白了,感谢您的澄清和链接!
    猜你喜欢
    • 1970-01-01
    • 2019-02-17
    • 2021-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-23
    • 1970-01-01
    • 2010-09-13
    相关资源
    最近更新 更多