Wall time(real time), Process time和Monotonic time.

本文深入解析Linux内核中的三种时间概念:Walltime(挂钟时间)、Processtime(进程执行时间)与Monotonictime(单调时间),解释了它们的定义、工作原理以及区别。Walltime代表现实时间,由变量xtime记录;Processtime是进程执行的时间;Monotonictime则代表系统启动后流逝的时间,通过jiffies记录且保持单调递增。

转载:http://blog.youkuaiyun.com/aganlengzi/article/details/21888351


Wall time,也就是rtc时钟。 CLOCK_REALTIME
Process time,进程执行的时间。 
Monotonic time,也就是系统从boot后到当前的时间。 CLOCK_MONOTONIC


monotonic time字面意思是单调时间,实际上它指的是系统启动以后流逝的时间,
这是由变量jiffies来记录的。系统每次启动时jiffies初始化为0,每来一个timer interrupt,jiffies加1,也就是说它代表系统启动后流逝的tick数。
jiffies一定是单调递增的


wall time字面意思是挂钟时间,实际上就是指的是现实的时间,
这是由变量xtime来记录的。系统每次启动时将CMOS上的RTC时间读入xtime,
这个值是"自1970-01-01起经历的秒数、本秒中经历的纳秒数",每来一个timer interrupt,也需要去更新xtime。
wall time不一定是单调递增的,可以认为改变。

<think> 我们正在讨论Python中的time.monotonic()函数。根据引用[1],我们知道: - monotonic()函数用于计算程序运行的时间。 - 它获得的时间与操作系统的时间无关,即使修改系统时间也不会影响其返回值。 - 使用方法:通过记录开始时间结束时间,然后计算差值得到运行时间(单位:秒)。 引用[2]提到: - 'monotonic'是支持的时钟名称之一,对应的函数是time.monotonic()。 引用[3]虽然提供了time模块的其他用法示例,但并没有直接提及monotonic(),因此我们可以忽略这部分。 现在,我将详细解释time.monotonic()函数: 1. **功能**:monotonic()函数返回一个单调递增的时间值(以秒为单位)。这个时间值是相对于某个未指定的起点(比如系统启动时间)的。它的特点是不会因为系统时间的调整(如手动更改系统时间或自动同步时间)而回溯或跳跃,因此特别适合用于测量时间间隔。 2. **返回值**:返回值是一个浮点数,表示从某个固定点(例如系统启动)开始经过的时间。由于起点是未指定的,所以只有两次调用之间的差值才有意义。 3. **使用方法**: - 导入time模块:`import time` - 在要计时的代码段开始前调用一次:`start = time.monotonic()` - 在代码段结束后调用一次:`end = time.monotonic()` - 计算时间差:`duration = end - start`(单位:秒) 4. **注意事项**: - 由于返回值是浮点数,所以可以精确到小数秒(具体精度取决于系统)。 - 该函数是单调的,所以适合用于测量耗时、超时等需要避免时间调整影响的场景。 5. **与time.time()的区别**: - time.time()返回的是当前系统时间(即时间戳),它可能会因为系统时间的调整(如NTP同步)而出现倒退或跳跃,因此不适合用于精确测量时间间隔。 - time.monotonic()则不会倒退,即使系统时间被调整,它也会持续递增。 6. **示例代码**: 下面是一个使用time.monotonic()测量代码执行时间的简单示例: ```python import time start = time.monotonic() # 模拟耗时操作 time.sleep(2) # 休眠2秒 end = time.monotonic() print(f"程序运行时间: {end - start:.2f}秒") ``` 输出结果应该大约是2秒。 7. **适用场景**: - 性能测试:测量函数或代码块的执行时间。 - 超时控制:在循环中检查是否超时。 - 任何需要可靠时间间隔测量的场合。 现在,根据要求,我需要生成相关问题: §§相关问题§§ 1. time.monotonic()time.perf_counter()有什么区别? 2. 在哪些情况下应该使用time.monotonic()而不是其他时间函数? 3. 如何提高使用time.monotonic()测量时间间隔的精度? </think> ### Python中`time.monotonic()`函数详解 #### 1. **核心功能与特点** - **单调递增性**:返回的时间值**只增不减**,不受系统时间调整(如NTP同步、手动修改)影响[^1]。例如系统时间从10:00回拨到9:55时,`monotonic()`仍保持连续递增。 - **时间间隔测量**:专用于精确计算**程序运行时间差**(如性能测试、超时控制),不适用于获取日历时间。 - **跨平台一致性**:在Windows/Linux/macOS等系统中行为一致,均提供单调时钟。 #### 2. **基本使用方法** ```python import time # 记录起始时间 start = time.monotonic() # 待测代码段(示例:休眠1.5秒) time.sleep(1.5) # 记录结束时间并计算差值 end = time.monotonic() duration = end - start print(f"代码执行耗时: {duration:.4f}秒") # 输出示例: 代码执行耗时: 1.5002秒 ``` #### 3. **返回值说明** - **类型**:浮点数(`float`),单位:秒 - **精度**:通常达到**微秒级**(1e-6秒),具体取决于操作系统。 - **基准点**:返回值是相对于**未指定起点**的相对时间(通常为系统启动时刻),仅差值有意义。 #### 4. **与相似函数对比** | 函数 | 是否单调 | 是否受系统时间影响 | 典型用途 | |------|----------|-------------------|----------| | `monotonic()` | ✅ | ❌ | 程序耗时测量 | | `time()` | ❌ | ✅ | 获取日历时间 | | `perf_counter()` | ✅ | ❌ | 最高精度耗时测量 | | `process_time()` | ✅ | ❌ | 进程CPU时间统计 | > **注意**:`perf_counter()`提供更高精度(纳秒级),但`monotonic()`在多数场景下更轻量高效[^2]。 #### 5. **典型应用场景** 1. **性能分析**:精确测量函数执行时间 ```python def test_performance(): start = time.monotonic() # ...复杂计算... print(f"耗时: {time.monotonic() - start:.6f}秒") ``` 2. **超时控制**:循环中的操作时间限制 ```python timeout = 5.0 # 5秒超时 start = time.monotonic() while condition: if time.monotonic() - start > timeout: raise TimeoutError ``` 3. **帧率控制**:游戏/动画的恒定帧间隔 ```python frame_time = 1/60 # 60FPS last_frame = time.monotonic() while running: current = time.monotonic() if current - last_frame >= frame_time: render_frame() last_frame = current ``` #### 6. **注意事项** - **不可序列化**:返回值是相对时间点,重启程序后值会重置。 - **精度声明**:建议用`time.get_clock_info('monotonic')`获取实际精度: ```python print(time.get_clock_info('monotonic')) # 输出示例: namespace(adjustable=False, implementation='clock_gettime(CLOCK_MONOTONIC)', monotonic=True, resolution=1e-09) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值