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 如何用单调时钟获取更精确的时间间隔的更多相关文章

  1. nanosleep() -- 更精确的延迟 -----一个使用用例

    [常规] nanosleep() -- 更精确的延迟 [复制链接]     beyes 4220 主题 5152 帖子 3万 积分 GROAD 曲径通幽,安觅芳踪. 积分 30607 发消息 电梯直达 ...

  2. 【百度地图API】如何用圆形搜索获取中心点周围100米内全部关键点?如天安门附近所有的餐厅、加油站、宾馆、大厦等

    原文:[百度地图API]如何用圆形搜索获取中心点周围100米内全部关键点?如天安门附近所有的餐厅.加油站.宾馆.大厦等 摘要: 在LBS上有这样一个常用的功能,查找附近所有的关键点(POI点,比如标志 ...

  3. Python:如何用一行代码获取上个月是几月

    现在转一篇志军100发于公众号 Python之禅的文章: Python:如何用一行代码获取上个月是几月 抱歉我用了个有点标题党的标题,因为担心你错过了本文,但内容绝对干货,本文介绍的关于Python时 ...

  4. Mac 上 QuickTime Player 播放器以 1.1、1.2 倍速等更精确速度快进/快退播放的方法

    苹果的 QuickTime Player 播放器上点击双箭头按钮可以用 2.4.8 倍的速度快进/快退播放视频,但是 2 倍速太快了,如果我想以 1.1.1.2 倍速这种更精确的速度控制视频播放呢?按 ...

  5. 微信小程序 报错 “对应的服务器无效。控制台输入 showRequestInfo()可以获取更详细信息”

    之前做的项目突然无法读出数据了,一测试发现报这个错误==>对应的服务器无效.控制台输入 showRequestInfo()可以获取更详细信息,后来发现是SSL证书到期了.重新申请了一个证书,免费 ...

  6. 利用奇偶数来获取websocket推送时间间隔(或者比较前一个数和下一个数的变化)

    利用奇偶数来获取websocket推送时间间隔(或者比较前一个数和下一个数的变化) 在vue中的 data () {     return { countTime: 0,         newDat ...

  7. HTTP协议下保证密码不被获取更健壮方式

    说到在http协议下用户登录如何保证密码安全这个问题:    小白可能第一想法就是,用户在登录页面输入密码进行登录时,前台页面对用户输入的密码进行加密,然后把加密后的密码作为http请求参数通过网络发 ...

  8. 在XcodeGhost事件之后,获取更纯净的Xcode的方法。

    正值Xcode 7正式版本的更新,IOS界就冒出了个甚至可以说成涉及国家安全的大事也不为过的事件: 也可以点击网址链接看总结的更完整的文章:众多知名 APP 都中毒了,XCodeGhost 病毒事件汇 ...

  9. HTTP协议下保证登录密码不被获取更健壮方式

    说到在http协议下用户登录如何保证密码安全这个问题:    小白可能第一想法就是,用户在登录页面输入密码进行登录时,前台页面对用户输入的密码进行加密,然后把加密后的密码作为http请求参数通过网络发 ...

  10. [JAVA]比毫秒System.currentTimeMillis()更精确的时间戳(纳米级时间戳)

     纳秒 ns(nanosecond):纳秒, 时间单位.一秒的10亿分之中的一个,即等于10的负9次方秒. 经常使用作 内存读写速度的单位,其前面数字越小则表示速度越快. 1纳秒=1000 皮秒 ...

随机推荐

  1. 前端开发系列062-网络篇之前端开发Ajax简单介绍

    一.Ajax技术简单介绍 Ajax是一门异步的用于发送网络请求的技术. 全称为:Async javascript and XML. 简单说明:Ajax 这个概念是由 Jesse James Garre ...

  2. leetcode 5 最长回文串

    简介 使用中心扩散法, 发现我的代码有很多的bug.改了很久 简单来说动态规划, 不如 中心扩散法来的容易理解. code class Solution { public: string longes ...

  3. java 各个文件夹的含义

    简介 java 后端项目常常会使用 类似dao, service, 之类的文件夹, 这些文件夹之间是如何协作的呢?? SpringMVC的层: DAO, Service, Controller, Vi ...

  4. ubuntu 开机自动启动程序

    简介 RT 参考链接 https://www.cnblogs.com/downey-blog/p/10473939.html 下面的链接靠谱些 https://zhuanlan.zhihu.com/p ...

  5. vue 学习视频推荐 & 初始化项目流程

    简介 vue 有些名词听着很牛逼 vue-路由 啥的就是 标签的不再刷新的版本.其实选一个比较好的入门的视频挺好的. bilibili link https://www.bilibili.com/vi ...

  6. [原创]《C#高级GDI+实战:从零开发一个流程图》第07章:来吧,自定义“画布”控件!

    一.前言 上节课已经抽象出来了形状和连线,但是没解决程序复用的问题:现在所有的代码是写在窗口中的,如果想在其它程序想实现流程图,只能重新写代码或者复制粘贴代码,没办法简单复用,而且也无法保证功能的完整 ...

  7. Streamlit入门 中文文档

    基础概念 使用 Streamlit 进行开发非常简单.首先,在普通的 Python 脚本中添加几条 Streamlit 命令,然后使用 streamlit run 命令来运行它: streamlit ...

  8. Podman + Nginx + Affine 踩坑教程

    安装 Podman 安装 podman 很简单 sudo apt install podman 验证安装 podman info 创建一个 pod 用于安装 Nginx 和 Affine podman ...

  9. snowflake算法的workerId问题

    snowflake做为一个轻量级的分布式id生成算法,已经被广泛使用,大致原理如下: 中间10位工作机器id(即:workerId),从图上可以知道,最多2^10次方,即1024台机器 最右侧12位序 ...

  10. 解决nginx: [emerg] unknown directive “stream“ in /etc/nginx/nginx.conf问题 --九五小庞

    参考链接:https://blog.csdn.net/User_bie/article/details/128102168 Nginx在编译安装时,需指定安装的模块