System.currentTimeMillis的性能如何

article/2025/10/30 10:53:24

一、背景

撸代码时发现System.currentTimeMillis的调用都被封装成了cache类型,代码如下:

 那么System.currentTimeMillis真的有这么这么差吗,如果差的话又是什么原因造成的?什么情况下可以直接调用原生方法,什么情况下需要使用缓存呢?

二、测试

先问会不会,再问为什么。那么System.currentTimeMillis的性能是否真的有这么差,很多大佬给出了自己的测试case并总结出下面两个结论

1在高并发场景下System.currentTimeMillis()并发问题严重,甚至比创建一个普通对象要耗时的多

2)单线程执行System.currentTimeMillis();比多线程并发执行System.currentTimeMillis();快了许多倍

2.1 单线程场景

大家都在讨论多线程场景下的表现,那么单线程场景下它的表现如何,测试代码如下:

 分别跑System.currentTimeMillis 和new 简单对象1k,1w,10w次,测试结果如下:

amazing了,System.currentTimeMillis 竟然在单线程下的性能也比new一个对象差那么多

2.2 多线程场景

看起来线程数和平均耗费时间成正比例,串行处理

三、原理

参考:http://pzemtsov.github.io/2017/07/23/the-slow-currenttimemillis.html

挖源码就到此为止,因为已经有国外大佬深入到了汇编的级别来探究,简单来讲就是:

  • 调用gettimeofday()需要从用户态切换到内核态;
  • gettimeofday()的表现受Linux系统的计时器(时钟源)影响,在HPET计时器下性能尤其差;
  • 系统只有一个全局时钟源,高并发或频繁访问会造成严重的争用。

所以在调用次数少的时候是可以忍受的,效率不会太慢。调用次数多的时候产生竞争才会造成耗时变长。

nanoTime也并不能解决问题。

查看linux系统使用的数据源:

四、解决方法

1)如开头,缓存时钟

2)更改时钟源

 

 


http://chatgpt.dhexx.cn/article/MimfI1C6.shtml

相关文章

别再用 System.currentTimeMillis 统计耗时了,太 Low,试试 Spring Boot 源码在用的 StopWatch吧,够优雅

大家好,我是二哥呀! 昨天,一位球友问我能不能给他解释一下 SpringBootApplication 注解是什么意思,还有 Spring Boot 的运行原理,于是我就带着他扒拉了一下这个注解的源码,还有 SpringApplication 类的 ru…

System.currentTimeMillis的性能,真有如此不堪吗?

# 疑惑,System.currentTimeMillis真有性能问题? 最近我在研究一款中间件的源代码时,发现它获取当前时间不是通过System.currentTimeMillis,而是通过自定义的System.currentTimeMillis的缓存类(见下方)&…

疑惑,System.currentTimeMillis真有性能问题?

点击关注公众号,Java干货及时送达 System.currentTimeMillis的性能真有如此不堪吗? 最近我在研究一款中间件的源代码时,发现它获取当前时间不是通过System.currentTimeMillis,而是通过自定义的System.currentTimeMillis的缓存类&a…

高并发下System.currentTimeMillis()性能问题及优化方案

文章目录 背景System.currentTimeMillis()性能测试单线程测试多线程测试 原因优化优化代码单线程测试多线程测试 参考 背景 最近在看asyncTool源码发现了System.currentTimeMillis存在卡顿问题,所以就详细研究了下。具体如何呢?我们来看看 System.curr…

currentTimeMillis()方法

currentTimeMillis()方法返回一个long类型的值,该值表示的是当前时间与1970年1月1日0时0分0秒之间的时间差,单位是毫秒,习惯上被称为时间戳 源码: 时间戳可以用来计算循环操作时所需要的时间: /*** 向goods表中插入…

Java获取当前时区时间LocalDateTime与System.currentTimeMillis

Java获取当前时区时间 System.currentTimeMillisLocalDateTime最终结果 全球根据纬度不同,划分不同的时区。对于此时此刻,大家同处同一个时间点,但是,每个时区的时间表示是不同的。Java可以使用 System.currentTimeMillis和 Loc…

关于Java currentTimeMillis方法简述

刚刚接触JAVA时,为了便于记录某个方法块的执行时间,通常都会在代码块的执行前和执行后各标记一个时间,取两个时间差。 但是初学者一般只会选择用LocalDateTime来标记,然后用Duration.between来做差值。当然,Duration可…

System.currentTimeMillis()计算方式与时间的单位转换

一、时间的单位转换 1秒1000毫秒(ms) 1毫秒1/1,000秒(s) 1秒1,000,000 微秒(μs) 1微秒1/1,000,000秒(s) 1秒1,000,000,000 纳秒(ns) 1纳秒1/1,000,000,000秒(s) 1秒1,000,000,000,000 皮秒(ps) 1皮秒1/1,000,000,000,000秒(s) …

Java currentTimeMillis()方法介绍

一、官方文档 参考自Java SE 8官方文档: 方法功能:返回从1970年1月1日午夜(UTC)开始到当前时间的毫秒值. 其中,需要特别说明的地方 1.午夜(midnight)指的时间是 0时0分0秒,UTC表示该时间是0时区的时间…

Android中Intent和IntentFilter进行通信

文章目录 Intent启动不同组件的方法ActivityServiceBroadcastReceiver Data,Type属性与intent-filter配置指定Action调用系统的Activity启动Activity的标准Action常量以及对应的字符串标准的Category常量以及对应的字符串 实例一查看并获取联系人电话MainActivity代…

三、Intent 和 Intent过滤器(IntentFilter)

Intent(意图): Intent 是一个消息传递对象,是我们要执行操作的一个抽象描述。我们可以使用它在相应的组件中传递消息和请求。下面是它的主要使用场景: 1. 启动Activity 通过 startActivity() 或者 startActivityForRes…

【Android】Intent 和 Intent Filter

一. Intent 简介 Intent 是一个消息传递对象,您可以用来从其他应用组件请求操作。可以用于:启动 Activity、启动服务、传递广播。 https://developer.android.com/guide/components/intents-filtershttps://developer.android.com/guide/components/i…

Android开发——IntentFilter的匹配规则

1. IntentFilter中的过滤信息 启动Activity分为显式调用和隐式调用,前者没什么好讲的,后者需要Intent能够匹配目标组件的IntentFilter中所设置的过滤信息。包括action、category、data。 一个Activity中可以有多个IntentFilter,一个Intent…

Android中的Intent和Intent-filter总结

一.相关概念 (一)基本概念 Intent中文意思指”意图”,按照Android的设计理念,Android使用Intent来封装程序的”调用意图”,不管启动Activity、Service、BroadcastReceiver,Android都使用统一的Intent对象来封装这一”启动意图”。此外,Inten…

【intent-filter】AndroidManifest中<intent-filter>标签的 部分作用

这里写自定义目录标题 AndroidManifest.xmlIntent-filter 标签Intent-filter 标签中的常用元素Intent-filter 标签的作用Intent对象Intent显式启动活动窗口Intent隐式启动(重要) AndroidManifest.xml AndroidManifest.xml是安卓开发中主配置文件&#x…

IntentFilter功能简介

1.什么是IntentFilter ? IntentFilter翻译成中文就是“意图过滤器”,主要用来过滤隐式意图。当用户进行一项操作的时候,Android系统会根据配置的 “意图过滤器” 来寻找可以响应该操作的组件,服务。 例如:当用户点击…

简述 IntentFilter(意图过滤器)

转载自:http://www.cnblogs.com/ywtk/p/4158103.html 侵删 1.什么是IntentFilter ? IntentFilter翻译成中文就是“意图过滤器”,主要用来过滤隐式意图。当用户进行一项操作的时候,Android系统会根据配置的 “意图过滤器” 来寻找可…

IntentFilter详解

IntentFilter的意思就是意图过滤器,当我们隐式的启动系统组件的时候,就会根据IntentFilter来筛选出合适的进行启动。 如果组件的 IntentFilter 与 Intent 中的 IntentFilter 正好匹配,系统就会启动该组件,并把 Intent 传递给它。如…

WPF MessageBox简单用法

1、弹出小框 用法: if (MessageBox.Show("内容", "标题", MessageBoxButton.YesNo, MessageBoxImage.Information) MessageBoxResult.Yes){label1.Content "yes";}else{label1.Content "no";} 2、例子 if (MessageBo…

C# winform 中MessageBox用法大全(附效果图)

我们在程序中经常会用到MessageBox。 MessageBox.Show()共有21中重载方法。现将其常见用法总结如下: 1.MessageBox.Show(“Hello~~~~”); 最简单的,只显示提示信息。 2.MessageBox.Show(“There are something wrong!”,“ERROR”); 可以给消息框加上…