【发布时间】:2015-04-07 12:41:12
【问题描述】:
Libc provides the clock function 用于测量 Linux 进程的 CPU 时间。我想知道这种方法在现代计算机中是否仍然可靠/有意义?为什么“CLOCKS_PER_SEC”是一个常数?为什么假设每台机器每秒有 1e6 条指令?此外,现代处理器甚至可以扩展时钟频率。
【问题讨论】:
标签: c linux time linux-kernel libc
Libc provides the clock function 用于测量 Linux 进程的 CPU 时间。我想知道这种方法在现代计算机中是否仍然可靠/有意义?为什么“CLOCKS_PER_SEC”是一个常数?为什么假设每台机器每秒有 1e6 条指令?此外,现代处理器甚至可以扩展时钟频率。
【问题讨论】:
标签: c linux time linux-kernel libc
不,它不再相关;它在添加时设计不佳,不再适合其预期的用例。许多细节被冻结以保持向后兼容性。
请改用 POSIX.1-2001 clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &ts)。理论上你可以使用它达到纳秒级精度。
【讨论】:
让我分享一下我的理解。
CLOCKS_PER_SEC 与 CPU 时钟没有直接关系。想象一下,您有一个抽象计时器,其频率配置为每秒 1000000 滴答。实际上,这个频率非常低,可以通过划分 MAIN_CLK 在任何地方实现。 如果你的操作系统想要支持 POSIX 系统调用时钟,那么它必须实现这个 clock() 系统调用,它返回这个低频率计时器滴答的数量。 这就是为什么您只能使用 clock() 以 1 毫秒的粒度进行测量。
【讨论】:
CLOCKS_PER_SEC == 1000000 在 POSIX.1(最初是 SuSv4/XSI)中指定。至于粒度,1/1000000 = 1µs(微秒),而不是 1 ms(毫秒)。当前的 glibc 版本似乎在内部为此使用 clock_gettime() 系统调用,只是返回以微秒为单位的值。