我想在 glibc 中找到
clock
的实现,以了解它是如何工作的,并希望找到有关其解析的信息。
我找到了
clock
的源代码,结果发现它只是调用__times
并返回tms_utime
和tms_stime
的总和:
https://codebrowser.dev/glibc/glibc/sysdeps/posix/clock.c.html
/* Return the time used by the program so far (user time + system time). */
clock_t
clock (void)
{
struct tms buf;
if (__times (&buf) < 0)
return (clock_t) -1;
return buf.tms_utime + buf.tms_stime;
}
现在的问题是,要获取以秒为单位的时间,您必须将
clock
返回的值除以 CLOCKS_PER_SEC
,并从 times
获取以秒为单位的时间(这是 __times
的别名,因为我理解),你必须将 tms_utime
和 tms_stime
除以 sysconf(_SC_CLK_TCK)
,这对我来说是两个不同的值(1000000 和 100)。那么,这不是我正在寻找的实现吗?还是我误解了什么?
编辑:正如@n.m.couldbeanAI指出的那样,我感兴趣的实现位于sysdeps/unix/sysv/linux/clock.c(不是sysdeps/posix/clock.c)我最初链接)并使用
clock_gettime
乘以 CLOCKS_PER_SEC
提供的时间(如预期):
https://codebrowser.dev/glibc/glibc/sysdeps/unix/sysv/linux/clock.c.html
clock_t
clock (void)
{
struct __timespec64 ts;
_Static_assert (CLOCKS_PER_SEC == 1000000,
"CLOCKS_PER_SEC should be 1000000");
if (__glibc_unlikely (__clock_gettime64 (CLOCK_PROCESS_CPUTIME_ID, &ts) != 0))
return (clock_t) -1;
return (ts.tv_sec * CLOCKS_PER_SEC
+ ts.tv_nsec / (1000000000 / CLOCKS_PER_SEC));
}
这不是正确的实现。正如 @n.m.couldbeanAI 指出的,我感兴趣的实现位于 sysdeps/unix/sysv/linux/clock.c (不是我最初链接的 sysdeps/posix/clock.c)并且使用
clock_gettime
乘以 CLOCKS_PER_SEC
提供的时间(如预期):
https://codebrowser.dev/glibc/glibc/sysdeps/unix/sysv/linux/clock.c.html
clock_t
clock (void)
{
struct __timespec64 ts;
_Static_assert (CLOCKS_PER_SEC == 1000000,
"CLOCKS_PER_SEC should be 1000000");
if (__glibc_unlikely (__clock_gettime64 (CLOCK_PROCESS_CPUTIME_ID, &ts) != 0))
return (clock_t) -1;
return (ts.tv_sec * CLOCKS_PER_SEC
+ ts.tv_nsec / (1000000000 / CLOCKS_PER_SEC));
}
总之,
clock
在我的系统上并不是通过times
实现的,所以sysconf(_SC_CLK_TCK)
和CLOCKS_PER_SEC
不同是没有问题的。