rust 如何用单调时钟获取更精确的时间间隔
Wall Clock vs Monotonic Clock (墙上时钟 vs 单调时钟)
墙上时钟指的是我们日常意义上的时间,正如墙上的时钟代表的时间一样。单调时钟指的是某个时间点后开始计算的时间,单纯意义上的代表的时间是没有意义的。
操作系统上相对应的提供了两套时间,分别对应墙上时钟和单调时钟,操作系统用UTC来代表墙上时钟,UTC不支持闰秒, 并且可以认为更改,而且操作系统的时间是通过石英钟等来实现的,会由于温度等不可控因素导致时间发生偏移,
往往会通过网络时间协议NTP来进行同步,因此UTC天然存在着较大的误差,对于某些高性能场景的精准时间计算是不够的。
相对的,单调时钟保证时间一定是单调递增的,不存在时间往回拨。
Go语言怎么用单调时间计算花费时间
Go语言Time 结构体就定义了单调始终
type Time struct {
// wall and ext encode the wall time seconds, wall time nanoseconds,
// and optional monotonic clock reading in nanoseconds.
//
// From high to low bit position, wall encodes a 1-bit flag (hasMonotonic),
// a 33-bit seconds field, and a 30-bit wall time nanoseconds field.
// The nanoseconds field is in the range [0, 999999999].
// If the hasMonotonic bit is 0, then the 33-bit field must be zero
// and the full signed 64-bit wall seconds since Jan 1 year 1 is stored in ext.
// If the hasMonotonic bit is 1, then the 33-bit field holds a 33-bit
// unsigned wall seconds since Jan 1 year 1885, and ext holds a
// signed 64-bit monotonic clock reading, nanoseconds since process start.
wall uint64
ext int64
...
wall代表墙上始终,ext 代表单调时钟。
time.Sub内部先根据ext计算,如果没有ext,则根据UTC计算
func (t Time) Sub(u Time) Duration {
if t.wall&u.wall&hasMonotonic != 0 {
te := t.ext
ue := u.ext
d := Duration(te - ue)
if d < 0 && te > ue {
return maxDuration // t - u is positive out of range
}
if d > 0 && te < ue {
return minDuration // t - u is negative out of range
}
return d
}
d := Duration(t.sec()-u.sec())*Second + Duration(t.nsec()-u.nsec())
// Check for overflow or underflow.
switch {
case u.Add(d).Equal(t):
return d // d is correct
case t.Before(u):
return minDuration // t - u is negative out of range
default:
return maxDuration // t - u is positive out of range
}
}
大概是根据单调时间来计算花费的时间。
package main
import (
"fmt"
"time"
)
func main() {
t := time.Now()
time.Sleep(time.Second)
fmt.Printf("have past %f seconds.", time.Since(t).Seconds())
}
rust语言怎么计算单调时间
使用std::Instant:now()
use std::time::{Duration, Instant};
use std::thread::sleep;
fn main() {
let now = Instant::now();
sleep(Duration::new(2, 0));
println!("{}", now.elapsed().as_secs());
}
第三方库提供了更高性能的实现,有Coarse Time的实现coarsetime::Instant::now()以及基于Time Stamp Counter(TSC)寄存器的tikv/minstant库。
参考
rust 如何用单调时钟获取更精确的时间间隔的更多相关文章
- nanosleep() -- 更精确的延迟 -----一个使用用例
[常规] nanosleep() -- 更精确的延迟 [复制链接] beyes 4220 主题 5152 帖子 3万 积分 GROAD 曲径通幽,安觅芳踪. 积分 30607 发消息 电梯直达 ...
- 【百度地图API】如何用圆形搜索获取中心点周围100米内全部关键点?如天安门附近所有的餐厅、加油站、宾馆、大厦等
原文:[百度地图API]如何用圆形搜索获取中心点周围100米内全部关键点?如天安门附近所有的餐厅.加油站.宾馆.大厦等 摘要: 在LBS上有这样一个常用的功能,查找附近所有的关键点(POI点,比如标志 ...
- Python:如何用一行代码获取上个月是几月
现在转一篇志军100发于公众号 Python之禅的文章: Python:如何用一行代码获取上个月是几月 抱歉我用了个有点标题党的标题,因为担心你错过了本文,但内容绝对干货,本文介绍的关于Python时 ...
- Mac 上 QuickTime Player 播放器以 1.1、1.2 倍速等更精确速度快进/快退播放的方法
苹果的 QuickTime Player 播放器上点击双箭头按钮可以用 2.4.8 倍的速度快进/快退播放视频,但是 2 倍速太快了,如果我想以 1.1.1.2 倍速这种更精确的速度控制视频播放呢?按 ...
- 微信小程序 报错 “对应的服务器无效。控制台输入 showRequestInfo()可以获取更详细信息”
之前做的项目突然无法读出数据了,一测试发现报这个错误==>对应的服务器无效.控制台输入 showRequestInfo()可以获取更详细信息,后来发现是SSL证书到期了.重新申请了一个证书,免费 ...
- 利用奇偶数来获取websocket推送时间间隔(或者比较前一个数和下一个数的变化)
利用奇偶数来获取websocket推送时间间隔(或者比较前一个数和下一个数的变化) 在vue中的 data () { return { countTime: 0, newDat ...
- HTTP协议下保证密码不被获取更健壮方式
说到在http协议下用户登录如何保证密码安全这个问题: 小白可能第一想法就是,用户在登录页面输入密码进行登录时,前台页面对用户输入的密码进行加密,然后把加密后的密码作为http请求参数通过网络发 ...
- 在XcodeGhost事件之后,获取更纯净的Xcode的方法。
正值Xcode 7正式版本的更新,IOS界就冒出了个甚至可以说成涉及国家安全的大事也不为过的事件: 也可以点击网址链接看总结的更完整的文章:众多知名 APP 都中毒了,XCodeGhost 病毒事件汇 ...
- HTTP协议下保证登录密码不被获取更健壮方式
说到在http协议下用户登录如何保证密码安全这个问题: 小白可能第一想法就是,用户在登录页面输入密码进行登录时,前台页面对用户输入的密码进行加密,然后把加密后的密码作为http请求参数通过网络发 ...
- [JAVA]比毫秒System.currentTimeMillis()更精确的时间戳(纳米级时间戳)
纳秒 ns(nanosecond):纳秒, 时间单位.一秒的10亿分之中的一个,即等于10的负9次方秒. 经常使用作 内存读写速度的单位,其前面数字越小则表示速度越快. 1纳秒=1000 皮秒 ...
随机推荐
- ET5.0-添加心跳功能
ET5.0 demo中添加心跳功能 一.服务端 1:添加文件夹,在Model/Module文件夹下新建文件夹 Hearbeat 2:添加心跳配置文件 SessionHeartbeatCompone ...
- ET5.0运行--基础
nodejs转c#,刚刚开始使用ET,在运行Demo中记录了一下. ET5.0 githu: https://github.com/egametang/ET/tree/Branch_V5.0 环境: ...
- go-zero使用
官网文档地址: https://go-zero.dev/docs/tasks 这是一个脚手架,用于把proto文件或者api文件转为服务代码. 环境安装分4步(官网文档上有写): 1.安装golang ...
- mysql索引优化解决方案
mysql索引优化解决方案(在b站动力节点学习的) 可能因为这个视频是比较新的视频,评论区都没有什么笔记和文档.于是我就跟着视频边学边记录笔记.希望有些建表的代码,有需要的可以直接复制,减少了大家的无 ...
- 使用openOffice将office文件转成pdf
下载安装openoffice,下载地址:http://www.openoffice.org/download/ 我安装的目录: 输入cmd回车 在命令窗口输入 soffice -headless -a ...
- C# Avalonia动态加载xaml和cs实例
扩展请参考 https://www.cnblogs.com/dalgleish/p/18972924 NonCompiledXaml.axaml代码 <Window xmlns="ht ...
- 使用自然语言体验对话式MySQL数据库运维
大模型作为数据库管理的新界面 现代大型语言模型(LLM)本质上是一个经过深度训练的智能知识库,其显著特征包括: 全领域知识覆盖:内化了包括MySQL.PostgreSQL.MongoDB等各类数据库系 ...
- python 将数组写入文件
简介 常用功能 code import numpy as np import time test_data = np.random.rand(6000000,12) T1 = time.time() ...
- 关于模考 T2
今天做到模考的 T2,太有意思了. 题目描述 最近,Bob 学习了整数除法.受到这一神圣知识的启发,他决定进一步了解满足某些整除条件的正整数数组.具体来说,Bob 将一个数组 \(a=a_1,a_2, ...
- SciTech-EECS-MCU: 来自STM的STM32系列“高性能”单片机
STM32 Developer Zone https://www.st.com/en/microcontrollers-microprocessors.html# STM(STMicroelectro ...