我正在尝试理解clock_t clock(void);
功能更好,有以下问题:
我理解正确吗clock
测量进程的滴答数,因为它是积极奔跑 and sleep
挂起调用线程——在这种情况下只有一个线程,即主线程——因此挂起整个进程。意思就是clock
不测量进程的 cpu 时间(滴答数),因为它没有主动运行?
如果是这样,推荐的方法来测量实际所需的时间是什么?
"The clock()
函数返回程序使用的处理器时间的近似值。”Source https://linux.die.net/man/3/clock
“CPU 时间(处理时间)以时钟周期或秒为单位进行测量。”Source https://en.wikipedia.org/wiki/CPU_time
“每秒的时钟滴答数可以通过以下方式获得:sysconf(_SC_CLK_TCK);
" Source https://linux.die.net/man/2/times
#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
措施sleep
即挂起的线程?
No.
(嗯,它可以测量它,没有什么反对它。你可能有一个非常糟糕的操作系统来实现sleep()
as a while (!time_to_sleep_expired()) {}
忙循环。但是任何有自尊心的操作系统都会尝试让进程在运行时不使用CPU。sleep()
).
这意味着时钟不会测量进程的 cpu 时间(滴答声),因为它没有主动运行?
Yes.
如果是这样,推荐的方法来测量实际所需的时间是什么?
衡量“实时”使用情况clock_gettime(CLOCK_MONOTONIC, ...)
在 POSIX 系统上。
每秒时钟滴答数可以使用以下命令获得:sysconf(_SC_CLK_TCK);
是的,但请注意sysconf(_SC_CLK_TCK);
is not CLOCKS_PER_SECOND
。你不使用前times()
在你的函数中,你使用clock()
,我真的不明白你为什么打印sysconf(_SC_CLK_TCK);
。无论如何,请参阅示例sysconf(_SC_CLK_TCK) 与 CLOCKS_PER_SEC https://stackoverflow.com/questions/39712808/sysconf-sc-clk-tck-vs-clocks-per-sec .
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)