`

高并发场景下 System.currentTimeMillis() 的性能问题

    博客分类:
  • JDK
 
阅读更多
System.currentTimeMillis()的调用比new一个普通对象要耗时的多(具体耗时高出多少我还没测试过,有人说是100倍左右),然而该方法又是一个常用方法,有时不得不使用,比如日志,在高并发情形下怎么做才好呢?
System.currentTimeMillis()之所以慢是因为去跟系统打了一次交道,什么快?内存!如果该方法从内存直接取数,那岂不是相当快,看代码:
class MillisecondClock {
	private long rate = 0;// 频率
	private volatile long now = 0;// 当前时间

	private MillisecondClock(long rate) {
		this.rate = rate;
		this.now = System.currentTimeMillis();
		start();
	}

	private void start() {
		new Thread(new Runnable() {
			@Override
			public void run() {
				try {
					Thread.sleep(rate);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				now = System.currentTimeMillis();
			}
		}).start();
	}

	public long now() {
		return now;
	}

	public static final MillisecondClock CLOCK = new MillisecondClock(10);
}

用的时候直接CLOCK.now()即可,你可以适当的进行变形,比如调整更新频率,开放构造函数,设置daemon线程,改为懒汉模式等等。
如下图是同时开启100个线程,每个线程并发请求一亿次的结果,可见耗时相差16倍左右(环境:JDK 1.7 win7 64位 4核 4G)。


  • 大小: 253.2 KB
分享到:
评论

相关推荐

    高性能获取系统时间

    为了优化这种性能问题,我们可以考虑以下几种策略: 1. **缓存时间戳**:在多线程环境中,可以预先获取当前时间并存储在一个线程安全的数据结构(如`AtomicLong`)中,然后由各线程共享。这样减少了对系统调用的...

    java遍历list集合3种方式和性能对比

    在Java编程中,遍历List集合是常见的操作,有多种方式可以实现这一功能。下面将详细探讨三种遍历List集合的...至于增强型`for`循环,虽然在性能上可能稍逊一筹,但其简洁性和易读性使得它在许多场景下仍然非常受欢迎。

    android_os_SystemClock.rar_android

    4. 性能:如果在高并发环境中频繁调用此方法,可能会对系统性能造成影响,因为这需要同步硬件时钟和其他系统组件。 在实际开发中,通常不建议直接使用 `setCurrentTimeMillis()` 修改系统时间,除非有特殊的需求,...

    java计时器

    在高并发或多线程环境中,这种方式可能会因为系统时间更新延迟而产生误差。 - **CPU时间与真实时间**:上述计时方法记录的是“墙钟时间”(wall clock time),即从计时开始到结束所经过的真实时间。但在实际应用中,...

    Guava使用培训教程

    该库包含了集合、缓存、原生类型支持、并发库、常见注解、字符串处理、I/O等多方面的功能,能够帮助开发者在不增加额外依赖的情况下实现更为简洁、高效的代码编写。 ### Strings处理 #### Joiner(合并字符串) `...

    springBoot - 使用Aop统计方法时间

    注意,这种方法虽然简单易用,但在高并发场景下可能会对性能产生一定影响,因为它会增加每次方法调用的开销。在生产环境中,如果需要精确的性能数据,建议使用专门的性能监测工具,如JProfiler或VisualVM。

    java performance10

    NIO允许进行非阻塞I/O操作,可以在一定程度上缓解高并发下的性能瓶颈。 - **异步非阻塞I/O(AIO)**:随着硬件的发展和并发编程的需求增加,AIO成为了更先进的I/O模型。AIO允许异步发起I/O请求,无需等待数据传输...

    java_时间戳与Date_相互转化相关函数.txt

    这是一个非常常用的函数,尤其在需要记录事件发生时间或者进行定时任务等场景下。 ```java // 获取当前系统时间的时间戳 long currentTimestamp = System.currentTimeMillis(); // 输出当前时间的时间戳 System....

    Java多线程--让主线程等待所有子线程执行完毕

    在Java多线程环境中,让主线程等待所有子线程执行完毕是一个常见的需求,尤其是在处理大量数据或进行高性能计算时。这不仅有助于正确测量整体执行时间,还能够确保资源的正确释放和数据的一致性。 #### 详细解析 *...

    Log4j2异步写日志效率测试源码

    2. 创建大量日志事件,模拟高并发场景。 3. 使用System.currentTimeMillis()或其他性能度量工具记录开始时间。 4. 触发日志事件的生成,观察并记录处理时间。 5. 对比与同步模式下的性能,分析结果。 测试结果通常...

    java自动生成id策略

    值得注意的是,虽然这种策略可以满足大多数情况,但在高并发场景下,仅依赖毫秒数可能会导致ID冲突,因为两个请求可能在同毫秒内被处理。为了解决这个问题,可以考虑使用更复杂的分布式ID生成方案,如Twitter的...

    17.精确掌控并发:令牌桶算法在分布式环境下并发流量控制的设计与实现_V20240116.pdf

    - **性能优化:** 需要注意Redis操作的性能问题,尤其是高并发场景下的性能瓶颈。 - **监控与告警:** 实现监控和告警机制,以便及时发现并解决潜在问题。 #### 5. 结束语 令牌桶算法作为一种有效的流量控制手段,在...

    测试程序运行效率

    例如,在高并发环境下,系统时间的读取可能会受到调度延迟的影响,导致测量结果不准确。对于更高精度的需求,可以考虑使用 `System.nanoTime()`,它提供了纳秒级的时间戳,但需要注意的是,这种时间戳并不表示绝对...

    发现一个开源项目优化点,点进来就是你的了.doc

    本文主要讨论了在高并发场景下如何优化时间戳获取的性能问题,以及一个具体的开源项目——Cobar 和阿里巴巴的限流熔断工具 Sentinel 中采用的优化策略。 1. **时间戳获取的性能问题**: - 在Java中,`System....

    Java 并发核心编程原文+译文

    在Java 5和Java 6中,JVM引入了大量的并发工具和改进,以支持多处理器和多核系统上的高性能应用程序。以下是这些知识点的详细说明: 1. **线程基础**:线程是操作系统分配CPU时间的基本单元,Java通过`Thread`类...

    hibernate性能测试代码

    4. **并发测试**:模拟多线程或分布式环境,测试在高并发情况下的性能。 5. **结果分析**:收集测试数据,使用图形工具(如JProfiler或VisualVM)进行内存分析,或者使用像JMeter的报告功能来可视化性能指标。 在...

    redis-lock:Redis 分布式锁,解决分布式高并发问题

    Redis 分布式锁是解决高并发场景下数据一致性与安全性的关键工具,尤其在Java开发中,被广泛应用。本文将深入探讨Redis分布式锁的工作原理、实现方式以及在Java中的应用。 **一、Redis分布式锁的概念** 分布式锁是...

    消息队列延迟定时任务

    然而,需要注意的是,这种方法虽然简单,但在高并发场景下可能会有性能问题,因为需要频繁扫描整个有序集合。为了解决这个问题,可以考虑使用`BLPOP`或`BRPOP`命令在消息队列中阻塞等待新任务,或者使用Redis的`...

    java多线程实例

    Java 多线程实例 ...理解并掌握线程的创建、控制和同步是Java开发中不可或缺的部分,尤其在处理高并发和性能敏感的应用场景时。通过合理的线程管理和同步,开发者可以编写出高效、稳定的多线程应用程序。

Global site tag (gtag.js) - Google Analytics