在 Linux 中测量时间 - 时间 vs 时钟 vs getrusage vs clock_gettime vs gettimeofday vstimespec_get?

如何解决在 Linux 中测量时间 - 时间 vs 时钟 vs getrusage vs clock_gettime vs gettimeofday vstimespec_get?

问题是 C 和 C++ 中有几个不同的时间函数可用,其中一些函数在实现之间的行为不同。还有很多半答案。编译时钟函数列表及其属性将正确回答这个问题。首先,让我们问一下我们正在寻找的相关属性是什么。看了你的帖子,建议:

  • 时钟测量的是什么时间?(真实的,用户,系统,或者,希望不是,挂钟?)
  • 时钟的精度是多少?(s、ms、μs,还是更快?)
  • 时钟经过多少时间?或者有什么机制可以避免这种情况?
  • 时钟是单调的,还是会随着系统时间的变化而变化(通过 NTP、时区、夏令时、用户等)?
  • 上述内容在实现之间有何不同?
  • 具体功能是否过时、不规范等?

在开始列表之前,我想指出挂钟时间很少是正确使用的时间,但它会随着时区变化、夏令时变化或挂钟是否由 NTP 同步而变化。如果您使用时间来安排事件或对性能进行基准测试,那么这些都不是好事。它只顾名思义,墙上(或桌面)上的时钟。

以下是我目前在 Linux 和 OS X 中发现的时钟:

  • time()从操作系统返回挂钟时间,精度以秒为单位。
  • clock()似乎返回用户和系统时间的总和。它存在于 C89 及更高版本中。曾经这应该是 CPU 时间周期,但像 POSIX 这样的现代标准要求 CLOCKS_PER_SEC 为 1000000,最大可能精度为 1 μs。我的系统上的精度确实是 1 μs。这个时钟一旦达到顶峰就会回绕(这通常发生在 ~2^32 个滴答声之后,这对于 1 MHz 时钟来说不是很长)。man clock说从 glibc 2.18 开始,它是clock_gettime(CLOCK_PROCESS_CPUTIME_ID, ...)在 Linux 中实现的。
  • clock_gettime(CLOCK_MONOTONIC, ...)提供纳秒级分辨率,是单调的。我相信“秒”和“纳秒”是分开存储的,每个都存储在 32 位计数器中。因此,任何回绕都会在数十年的正常运行时间之后发生。这看起来是一个非常好的时钟,但不幸的是它在 OS X 上还不可用。POSIX 7描述CLOCK_MONOTONIC为一个可选扩展
  • getrusage()原来是我的情况的最佳选择。它分别报告用户和系统时间并且不回绕。我的系统上的精度为 1 μs,但我也在 Linux 系统(带有 GCC 4.1.2 的 Red Hat 4.1.2-48)上对其进行了测试,精度仅为 1 ms。
  • gettimeofday()以(名义上)μs 精度返回挂钟时间。在我的系统上,这个时钟似乎确实具有 μs 精度,但这不能保证,因为“系统时钟的分辨率取决于硬件”。POSIX.1-2008。“应用程序应该使用clock_gettime()函数而不是过时的gettimeofday()函数”,所以你应该远离它。Linux x86 并将其实现为系统调用
  • mach_absolute_time()是 OS X 上非常高分辨率 (ns) 计时的一个选项。在我的系统上,这确实提供了 ns 分辨率。原则上,这个时钟环绕,但是它使用 64 位无符号整数存储 ns,因此环绕在实践中不应该成为问题。便携性值得怀疑。
  • 我基于这个片段编写了一个混合函数,在 Linux 上编译时使用 clock_gettime,在 OS X 上编译时使用 Mach 计时器,以便在 Linux 和 OS X 上获得 ns 精度。

除非另有说明,否则上述所有内容都存在于 Linux 和 OS X 中。上面的“我的系统”是运行 OS X 10.8.3 和 MacPorts 的 GCC 4.7.2 的 Apple。


:对于 OS X,clock_gettime已从 10.12 (Sierra) 开始实施。此外,基于 POSIX 和 BSD 的平台(如 OS X)共享rusage.ru_utimestruct 字段。

解决方法

在计时函数中,timeclock
getrusageclock_gettimegettimeofdaytimespec_get我想清楚地了解它们是如何实现的以及它们的返回值是什么,以便知道我必须在什么情况下使用它们。

首先,我们需要将返回 挂钟值 的函数与返回 进程或线程值
的函数进行比较。gettimeofday返回挂钟值,根据传递给它的参数clock_gettime返回挂钟值 或进程或线程值。
并返回过程值。Clock``getrusage``clock

然后第二个问题是关于这些功能的实现以及它们的准确性。这些功能使用哪种硬件或软件机制。

似乎getrusage只使用内核刻度(通常为 1ms 长),因此不能比 ms
更准确。这样对吗?然后该getimeofday功能似乎使用了最准确的底层硬件。因此,在最近的硬件上,它的精度通常是微秒(由于 API
的原因不能更高)。怎么样clock,手册页谈到“近似”,这是什么意思?那么clock_gettime,API
是纳秒级的,是否意味着如果底层硬件允许它能够如此精确呢?单调性呢?

还有其他功能吗?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)> insert overwrite table dwd_trade_cart_add_inc > select data.id, > data.user_id, > data.course_id, > date_format(
错误1 hive (edu)> insert into huanhuan values(1,'haoge'); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive> show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 <configuration> <property> <name>yarn.nodemanager.res