`clock` 是否测量 `sleep` 即挂起的线程?
Does `clock` measure `sleep` i.e. suspended threads?
我正在尝试更好地理解 clock_t clock(void);
函数并有以下问题:
我是否正确理解 clock
测量进程的滴答数,因为它 主动 运行 并且 sleep
暂停调用线程——在这种情况下只有一个线程,即主线程——因此挂起整个进程。这意味着 clock
不测量进程的 cpu 时间(滴答),因为它不是主动 运行?
如果是,推荐的测量实际所需时间的方法是什么?
“clock()
函数 returns 程序使用的处理器时间的近似值。” 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
Does clock
measure sleep
i.e. suspended threads?
没有
(好吧,它可以测量它,没有什么反对它的。你可能有一个非常糟糕的 OS 将 sleep()
实现为一个 while (!time_to_sleep_expired()) {}
忙循环。但是任何自尊敬的 OS 将尝试使进程在 sleep()
时不使用 CPU。
Which means that clock does not measure the cpu-time (ticks) of the process, since it is not actively running?
是的。
If so what is the recommended way to measure the actual needed time?
要测量“实时”,请在 POSIX 系统上使用 clock_gettime(CLOCK_MONOTONIC, ...)
。
The number of clock ticks per second can be obtained using: sysconf(_SC_CLK_TCK);
是的,但请注意 sysconf(_SC_CLK_TCK);
不是 CLOCKS_PER_SECOND
。你没有在你的函数中使用 ex times()
,你使用 clock()
,我真的不明白你为什么打印 sysconf(_SC_CLK_TCK);
。无论如何,例如 .
我正在尝试更好地理解 clock_t clock(void);
函数并有以下问题:
我是否正确理解 clock
测量进程的滴答数,因为它 主动 运行 并且 sleep
暂停调用线程——在这种情况下只有一个线程,即主线程——因此挂起整个进程。这意味着 clock
不测量进程的 cpu 时间(滴答),因为它不是主动 运行?
如果是,推荐的测量实际所需时间的方法是什么?
“clock()
函数 returns 程序使用的处理器时间的近似值。” 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
Does
clock
measuresleep
i.e. suspended threads?
没有
(好吧,它可以测量它,没有什么反对它的。你可能有一个非常糟糕的 OS 将 sleep()
实现为一个 while (!time_to_sleep_expired()) {}
忙循环。但是任何自尊敬的 OS 将尝试使进程在 sleep()
时不使用 CPU。
Which means that clock does not measure the cpu-time (ticks) of the process, since it is not actively running?
是的。
If so what is the recommended way to measure the actual needed time?
要测量“实时”,请在 POSIX 系统上使用 clock_gettime(CLOCK_MONOTONIC, ...)
。
The number of clock ticks per second can be obtained using: sysconf(_SC_CLK_TCK);
是的,但请注意 sysconf(_SC_CLK_TCK);
不是 CLOCKS_PER_SECOND
。你没有在你的函数中使用 ex times()
,你使用 clock()
,我真的不明白你为什么打印 sysconf(_SC_CLK_TCK);
。无论如何,例如