如果返回的时间单位不同,如何通过times实现time.h中的clock()而不进行转换?

问题描述 投票:0回答:1

我想在 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));
}
c ubuntu time posix glibc
1个回答
0
投票

这不是正确的实现。正如 @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
不同是没有问题的。

© www.soinside.com 2019 - 2024. All rights reserved.