glibc中clock()基于times实现的单位差异困惑:是否理解有误?
关于glibc中clock()实现及时间单位的疑问解答
你找到的这段代码确实是glibc中clock()函数的正确实现。
你疑惑的CLOCKS_PER_SEC与sysconf(_SC_CLK_TCK)数值差异问题,根源在于glibc对__times做了封装处理,并非直接返回内核原始的times()系统调用结果:
- 内核层面的
times()系统调用,返回的tms_utime和tms_stime以系统时钟滴答为单位,该单位由sysconf(_SC_CLK_TCK)定义(你的环境中为100,即每10毫秒一个滴答)。 - 但glibc提供的
__times封装函数,会自动将内核返回的数值按比例缩放,转换为以CLOCKS_PER_SEC为单位的值(你的环境中为1000000,即微秒级精度)。
正因为这个内部转换,clock()函数可以直接返回tms_utime与tms_stime的总和,完全符合POSIX标准对clock()的要求——返回值除以CLOCKS_PER_SEC即可得到程序消耗的总CPU时间(秒)。
举个实际计算的例子:如果内核返回tms_utime为50(对应50×10ms=0.5秒),__times会将其转换为500000;tms_stime为30(对应0.3秒),转换后为300000。clock()返回两者之和800000,除以CLOCKS_PER_SEC(1000000)就得到0.8秒,与实际CPU时间完全匹配。
内容的提问来源于stack exchange,提问作者Yui Rio
相关产品推荐
相关产品推荐

