生成纳秒级别的时间戳,高性能

news2025/2/25 7:23:32

问题

同步influxdb有些数据没有,不知道啥原因,后来百度发现时间需要唯一,毫秒还会重复,只能采用纳秒处理了

java实现

TimeStampUtils.java

package com.wujialiang;

/**
 * 获取纳秒值的工具类
 */
public class TimeStampUtils {

    /**
     * 递增数初始值
     */
    private static long randomNum = 1L;

    /**
     * 递增数最大值,可根据并发情况适当调整
     * 比如1秒钟生成1万条数据,这个值尽量接近或者大于1万
     */
    private static final long RANDOM_NUM_MAX = 999L;

    public static long getTimeStamp() {
        long curRandomNum;
        synchronized (TimeStampUtils.class) {
            if (randomNum > RANDOM_NUM_MAX) {
                randomNum = 1;
            }
            curRandomNum = randomNum++;
        }
        return System.currentTimeMillis() * 1000000L + System.nanoTime() % 1000000L + curRandomNum;
    }
}

测试

public static void main( String[] args )
{
    for (int i = 0; i < 100; i++) {
        System.out.println(TimeStampUtils.getTimeStamp());
    }
}

在这里插入图片描述

C#实现

NanoHelper.cs

using System.Diagnostics;

namespace InfluxdbStu01;

public class NanoHelper
{
    private static readonly object lockObj = new object();

    /// <summary>
    /// 递增数初始值
    /// </summary>
    private static long randomNum = 1L;

    /// <summary>
    /// 递增数最大值,可根据并发情况适当调整
    /// 比如1秒钟生成1万条数据,这个值尽量接近或者大于1万
    /// </summary>
    private const long RANDOM_NUM_MAX = 999L;

    /// <summary>
    /// 返回纳秒
    /// </summary>
    /// <returns>返回的结果是纳秒</returns>
    public static long getTimeStamp()
    {
        long curRandomNum;
        lock (lockObj)
        {
            if (randomNum > RANDOM_NUM_MAX)
            {
                randomNum = 1;
            }

            curRandomNum = randomNum++;
        }

        long nanoPart = Stopwatch.GetTimestamp(); // 计时器刻度(不是纳秒)
        long nowTimestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
        /*
        皮秒 纳秒 微秒 毫秒 秒 ps、ns、us、ms、s 时间单位之间的换算
        1,000,000,000,000皮秒=1秒 (12个0)ps -> s
        1,000,000,000纳秒=1秒         (9个0) ns -> s
        1,000,000微秒=1秒                 (6个0)us -> s
        1,000毫秒=1秒                        (3个0) ms -> s
        */
        return  nowTimestamp* 1000000L
                + nanoPart % 1000000L + curRandomNum;
    }
}

测试

NanoHelper.getTimeStamp()

优化

上面代码效率比较低,优化一下,这个不加锁,效率比较高但是会有重复,要求不高可以使用

using System.Diagnostics;

namespace InfluxdbStu01;

public class TimeStampHelper
{
    private static readonly Stopwatch StopwatchInstance = new Stopwatch();
    
    // 静态构造函数,确保Stopwatch在类首次被访问时开始  
    static TimeStampHelper()
    {
        StopwatchInstance.Start();
    }

    /// <summary>  
    /// 返回一个组合了Unix时间毫秒和Stopwatch刻度的“时间戳”  
    /// 注意:这不是真正的纳秒精度,但提供了比毫秒更高的精度
    /// 会重复
    /// </summary>  
    /// <returns>返回一个long类型的时间戳</returns>  
    public static long GetTimeStamp()
    {
        long nowTimestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
        long stopwatchTicks = StopwatchInstance.ElapsedTicks; // 获取Stopwatch的刻度  

        // 这里假设Stopwatch的刻度频率足够高,以提供亚毫秒级别的精度  
        // 但注意,这仍然不是纳秒级别的精度  
        // 如果需要纳秒级别的精度,您可能需要考虑使用硬件计时器或其他高精度时间源  

        // 根据Stopwatch的Frequency将刻度转换为更小的单位(例如微秒或纳秒的近似值)  
        // 但由于Frequency的单位是TicksPerSecond,我们需要先将其转换为纳秒/刻度,然后再乘以刻度数  
        double nanosecondsPerTick = 1_000_000_000.0 / Stopwatch.Frequency; // 纳秒/刻度  
        long subMillisecondNanoseconds = (long)(stopwatchTicks * nanosecondsPerTick);

        // 注意:由于double到long的转换,这里可能会有精度损失  
        // 如果需要更高的精度,可以保留为double或更大的整数类型,但这样会增加存储和处理的复杂性  

        // 将毫秒时间戳和亚毫秒纳秒部分组合起来  
        // 这里假设subMillisecondNanoseconds不会大于999,999,999(即小于1毫秒),这通常是合理的  
        return nowTimestamp * 1_000_000_000L + subMillisecondNanoseconds;
    }
}

100万数据54毫秒,但是重复数据有一半,优化重复的问题

namespace InfluxdbStu01;

public class TimeStampHelper2
{
    private static readonly object counterLock = new object(); // 用于同步的锁对象
    private static long counter; // 简单的递增计数器  

    /// <summary>  
    /// 返回一个组合了Unix时间毫秒和递增计数器的“时间戳”  
    /// 注意:这不是真正的纳秒精度,但在毫秒级别上增加了计数器以防止短时间内重复  
    /// </summary>  
    /// <returns>返回一个long类型的时间戳</returns>  
    public static long GetTimeStamp2()
    {
        long nowTimestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();

        // 使用锁来确保计数器的线程安全递增  
        lock (counterLock)
        {
            if (counter >= int.MaxValue) // 防止计数器溢出(可选)  
            {
                counter = 0; // 重置计数器(可选)  
            }

            counter++;
        }

        // 将毫秒时间戳和计数器组合起来(这里简单地将计数器作为额外的精度添加)  
        // 注意:这种方法仍然可能在极短的时间内产生重复,但比仅使用时间戳的可能性小  
        return (nowTimestamp * 1000) + (int)counter; // 假设counter不会超过int范围  
    }
}

100万数据,53毫秒,没有重复,如果数据量够大的情况可能会出现,但是目前满足业务需求

参考

https://blog.csdn.net/hahawangzi520/article/details/134846374

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1801615.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

面试题-Vue2和Vue3的区别

文章目录 1. 响应式系统2. 组合式 API (Composition API)3. Fragment (碎片)4. Teleport (传送门) 5. 性能改进6. 移除或改变的功能7. 构建工具8. TypeScript 支持 Vue 2 和 Vue 3 之间存在许多重要的区别&#xff0c;这些区别涵盖了性能、API 设计、组合式 API&#xff08;Com…

产品NPDP+项目PMP助你成长

前言 从管理的角度来讲,产品经理和项目经理的区别,我们应该吧项目经理和产品的区别分为一纵一横,那一纵就是我们的项目经理,项目经理在整个新产品研发过程中他扮演的是管理监督项目参与者的角色,其中包括研发部门、技术部门、市场部门或是销售部门等等。他所要做的事情就…

【Unity】Kafka、Mqtt、Wesocket通信

1 前言 最近研究了下kafka、mqtt、webocket插件在Unity网络通信中的应用&#xff0c;做下小总结吧。&#xff08;不想写笔记&#xff0c;但不写又会忘&#xff0c;痛苦&#xff09; 2 Kafka 先说结果&#xff1a;Kafka实现失败。 我会使用的方法是在VS里安装了Confluent.Kafka…

压缩大文件消耗电脑CPU资源达到33%以上

今天用7-Zip压缩一个大文件&#xff0c;文件大小是9G多&#xff0c;这时能听到电脑风扇声音&#xff0c;查看了一下电脑资源使用情况&#xff0c;确实增加了不少。 下面是两张图片&#xff0c;图片上有电脑资源使用数据。

05--Git分布式版本控制系统

前言&#xff1a;给后端工程师使用的版本控制器&#xff0c;本质上类似带时间标记的ftp&#xff0c;使用比较简单&#xff0c;就在这里归纳出来&#xff0c;供参考学习。 git1、概念简介 分布式版本控制系统&#xff08;Distributed Version Control System&#xff0c;DVCS&…

数据挖掘--分类

数据挖掘--引论 数据挖掘--认识数据 数据挖掘--数据预处理 数据挖掘--数据仓库与联机分析处理 数据挖掘--挖掘频繁模式、关联和相关性&#xff1a;基本概念和方法 数据挖掘--分类 数据挖掘--聚类分析&#xff1a;基本概念和方法 基本概念 决策树归纳 决策树:决策树是一…

从0开始学人工智能测试节选:Spark -- 结构化数据领域中测试人员的万金油技术(四)

上一章节我们了解了 shuffle 相关的概念和原理后其实可以发现一个问题&#xff0c;那就是 shuffle 比较容易造成数据倾斜的情况。 例如上一节我们看到的图&#xff0c;在这批数据中&#xff0c;hello 这个单词的行占据了绝大部分&#xff0c;当我们执行 groupByKey 的时候触发了…

关于怎么用Cubemx生成的USBHID设备实现读取一体的鼠标键盘设备(改进版)

主要最近做了一个要用STM32实现读取鼠标键盘一体的那种USB设备&#xff0c;STM32的界面上要和电脑一样的能通过这个USB接口实现鼠标移动&#xff0c;键盘的按键。然后我就很自然的去参考了正点原子的例程&#xff0c;可是找了一圈&#xff0c;发现正点原子好像用的库函数&#…

Docker的资源限制

文章目录 一、什么是资源限制1、Docker的资源限制2、内核支持Linux功能3、OOM异常4、调整/设置进程OOM评分和优先级4.1、/proc/PID/oom_score_adj4.2、/proc/PID/oom_adj4.3、/proc/PID/oom_score 二、容器的内存限制1、实现原理2、命令格式及指令参数2.1、命令格式2.2、指令参…

如何在 iPhone 上恢复已删除的短信

本文介绍如何检索已删除的短信和 iMessage 以及恢复丢失的消息。说明适用于 iOS 17 及更高版本。 如何在 iOS 17及更高版本中恢复文本 恢复已删除短信的最简单方法是使用 iOS 17。从删除短信到恢复它有 30 到 40 天的时间。 在“信息”的对话屏幕中&#xff0c;选择“过滤器”…

重塑楼宇管理:智慧管控可视化开启高效新篇章

借助图扑智慧楼宇管控可视化技术&#xff0c;实现实时监控与智能化管理&#xff0c;快速响应潜在问题&#xff0c;确保楼宇安全、节能和高效运行。

Qt/C++音视频开发76-获取本地有哪些摄像头名称/ffmpeg内置函数方式

一、前言 上一篇文章是写的用Qt的内置函数方式获取本地摄像头名称集合&#xff0c;但是有几个缺点&#xff0c;比如要求Qt5&#xff0c;或者至少要求安装了多媒体组件multimedia&#xff0c;如果没有安装呢&#xff0c;或者安装的是个空的呢&#xff0c;比如很多嵌入式板子&am…

[图解]建模相关的基础知识-05

1 00:00:01,510 --> 00:00:03,900 练习&#xff0c;我们就出这一道就行了 2 00:00:04,230 --> 00:00:07,210 这些都是像数理逻辑 3 00:00:08,140 --> 00:00:10,570 包括信息专业的 4 00:00:11,350 --> 00:00:12,900 包括文科的 5 00:00:12,910 --> 00:00:14…

论文高级图表绘制(Python语言,局部放大图)

本文将通过一个具体的示例,展示如何使用Python语言和Matplotlib库来绘制高级图表,包括局部放大图的制作。适用于多条曲线绘制在同一个图表中,但由于数据量过大,导致曲线的细节看不清,需要对细节进行局部放大。如下图: 环境准备 首先,确保你的Python环境中已经安装了以…

mqtt-emqx:keepAlive机制测试

mqtt keepAlive原理详见【https://www.emqx.com/zh/blog/mqtt-keep-alive】 # 下面开始写测试代码 【pom.xml】 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2…

数据结构(C语言)之对归并排序的介绍与理解

目录 一归并排序介绍&#xff1a; 二归并排序递归版本&#xff1a; 2.1递归思路&#xff1a; 2.2递归代码实现&#xff1a; 三归并排序非递归版本&#xff1a; 3.1非递归思路&#xff1a; 3.2非递归代码实现&#xff1a; 四归并排序性能分析&#xff1a; 欢迎大佬&#…

day40--Redis(二)实战篇

实战篇Redis 开篇导读 亲爱的小伙伴们大家好&#xff0c;马上咱们就开始实战篇的内容了&#xff0c;相信通过本章的学习&#xff0c;小伙伴们就能理解各种redis的使用啦&#xff0c;接下来咱们来一起看看实战篇我们要学习一些什么样的内容 短信登录 这一块我们会使用redis共…

碳素钢化学成分分析 螺纹钢材质鉴定 钢材维氏硬度检测

碳素钢的品种主要有圆钢、扁钢、方钢等。经冷、热加工后钢材的表面不得有裂缝、结疤、夹杂、折叠和发纹等缺陷。尺寸和允许公差必须符合相应品种国家标准的要求。 具体分类、按化学成分分类 &#xff1a; 碳素钢按化学成分&#xff08;即以含碳量&#xff09;可分为低碳钢、中…

问题:军保卡不允许开立附属卡,不能开展境外交易,不开通云闪付工功能() #其他#经验分享

问题&#xff1a;军保卡不允许开立附属卡&#xff0c;不能开展境外交易&#xff0c;不开通云闪付工功能&#xff08;&#xff09; A&#xff0e;A&#xff1a;正确 B&#xff0e;B&#xff1a;错误 参考答案如图所示

在线渲染3d怎么用?3d快速渲染步骤设置

在线渲染3D模型是一种高效的技术&#xff0c;它允许艺术家和设计师通过互联网访问远程服务器的强大计算能力&#xff0c;从而加速渲染过程。无论是复杂的场景还是高质量的视觉效果&#xff0c;在线渲染服务都能帮助您节省宝贵的时间。 在线渲染3D一般选择的是&#xff1a;云渲染…