`

高并发框架disruptor简单测试

阅读更多

Java中并发无外乎多线程加锁等方式,平时用的比较多的就是util.concurrency下的一些工具。除此之外业界比较推崇的就是erlang、scala中较为流行的actor模型,该模型是著名的无锁模型,actor(可以简单认为是轻量线程)之间通过发送消息进行通信,由事件驱动,全程无锁。

最近看论坛发现了另外一个并发模型-disruptor。它比较特殊,其核心是ringbuffer,闲来无事做了个简单测试。用它来模拟典型的生产者-消费者问题,本例中一个消费者-一个生产者,并将disruptor和jdk提供的ArrayBlockingQueue做了对比,发现在本人的笔记本上前者比后者快将近10倍!

 

闲话少叙,直接贴代码,如有意见或问题欢迎拍砖。

 

public class BqTest {
	static boolean ft = true;
	static boolean z = true;
	/**
	 * <b>Title:</b> main</br>
	 * <b>Description:</b> 
	 * @param args void   
	 * @throws:
	 * @author: shenbaise
	 */
	public static void main(String[] args) {
		BqTest bt = new BqTest();
		bt.test();
	}
	
	
	public void test(){
		
		long cost = System.currentTimeMillis();
		final BlockingQueue<Long> bq = new ArrayBlockingQueue<Long>(4096);
		
		Runnable p = new Runnable() {
			public void run() {
				for(int i= 0;i<100000000;i++){
					try {
						bq.put((long) i);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
				ft = false;
			}
		};
		
		Runnable c = new Runnable() {
			public void run() {
				while(ft || !bq.isEmpty()){
					try {
						bq.take();
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
				z = false;
			}
		};
		
		new Thread(c).start();
		
		new Thread(p).start();
		
		while(z){
			try {
				Thread.sleep(100);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		System.out.println("cost:"+(System.currentTimeMillis() - cost));
	}
	
	
}

 

disruptor的测试稍微麻烦点。

public final class ValueEvent {
	private long value;

	public long getValue() {
		return value;
	}

	public void setValue(final long value) {
		this.value = value;
	}

	public final static EventFactory<ValueEvent> EVENT_FACTORY = new EventFactory<ValueEvent>() {
		public ValueEvent newInstance() {
			return new ValueEvent();
		}
	};
}

 

public class MyEventHandler implements EventHandler<ValueEvent>{

	public long count = 0;

	public void onEvent(ValueEvent arg0, long arg1, boolean arg2)
			throws Exception {
		arg0.getValue();
		//  为了公平这里什么都不做
	}
}

 

/**
 * @author shenbaise
 */
public class RbTest {
		
	private static final int BUFFER_SIZE = 4096;
	
	public static void main(String[] args) {
		RbTest test = new RbTest();
		test.test();
	}
	
	public void test() {
		long cost = System.currentTimeMillis();
		RingBuffer<ValueEvent> ringBuffer =
	        createSingleProducer(ValueEvent.EVENT_FACTORY, BUFFER_SIZE, 
	        		new YieldingWaitStrategy());
	    SequenceBarrier sequenceBarrier = ringBuffer.newBarrier();
	    MyEventHandler handler = new MyEventHandler();
	    BatchEventProcessor<ValueEvent> batchEventProcessor = 
	    	new BatchEventProcessor<ValueEvent>(ringBuffer, sequenceBarrier, handler);
	    ringBuffer.addGatingSequences(batchEventProcessor.getSequence());
	    ExecutorService executor = Executors.newSingleThreadExecutor(Executors.defaultThreadFactory);
      executor.submit(batchEventProcessor);
	final RingBuffer<ValueEvent> rb = ringBuffer;
        for (long i = 0; i < 100000000; i++)
        {
            long next = rb.next();
            rb.get(next).setValue(i);
            rb.publish(next);
        }
        batchEventProcessor.halt();
        System.out.println("cost:"+(System.currentTimeMillis() - cost));
	}
}

 

最终ArrayBlockingQueue需要越20秒,而disruptor仅2秒左右。

测试环境:

写道
jdk7

主机名: WHITEME-PC
OS 名称: Microsoft Windows 7 旗舰版

系统制造商: LENOVO
系统型号: INVALID
系统类型: x64-based PC
处理器: 安装了 1 个处理器。
[01]: Intel64 Family 6 Model 37 Stepping 5 GenuineIntel ~2533 Mhz
BIOS 版本: LENOVO 2ECN29WW , 2010/9/21
物理内存总量: 3,957 MB
可用的物理内存: 987 MB
虚拟内存: 最大值: 7,911 MB
虚拟内存: 可用: 4,344 MB
虚拟内存: 使用中: 3,567 MB

 

2
0
分享到:
评论
2 楼 shenbai 2013-06-24  
Shen.Yiyang 写道
这个要支持一下,新产品啊~

应当不算什么新产品
1 楼 Shen.Yiyang 2013-06-24  
这个要支持一下,新产品啊~

相关推荐

    基于Spring Boot和LMAX Disruptor的高性能并发框架.zip

    介绍无锁并行计算框架Disruptor,并进行压力测试与JDK的BlockingQueue进行性能对比。 2. 无锁并行计算框架核心 学习无锁并行计算框架的基础使用与API。 介绍内部各种组件的原理和运行机制。 3. 无锁并行计算...

    Disruptor报错FatalExceptionHandler的解决办法,看网上这种解决办法挺少,整理了一下

    Disruptor是一款高性能的并发框架,它通过使用Ring Buffer和基于事件的处理方式来消除锁竞争,提升系统性能。在使用Disruptor过程中,开发者可能会遇到`FatalExceptionHandler`的错误,这通常是由于处理流程中的异常...

    Disruptor 一种可替代有界队列完成并发线程间数据交换高性能解决方案.docx

    Disruptor 是一个高性能的并发编程框架,由 LMAX 公司开发,旨在解决线程间数据交换的效率问题。它的设计目标是替代传统的有界队列,提供更高的吞吐量和更低的延迟。Disruptor 的核心在于其创新的数据交换机制,包括...

    disruptor jar包+Demo+Api

    《Disruptor 框架详解与应用实例》 ...总的来说,这个压缩包提供了一个了解和学习 Disruptor 的良好起点,通过阅读源码、示例代码和 API 文档,我们可以深入了解这个框架如何帮助我们构建高并发、低延迟的应用系统。

    基于JavaDisruptor的并发编程深度学习项目.zip

    本项目是一个深入学习Java并发编程和无锁并行计算框架Disruptor的课程源代码。通过本项目,你将学习到并发编程的核心概念、无锁并行计算框架的基础使用与高级特性,以及如何整合Disruptor与Netty构建高性能的网络...

    多线程与高并发-电子.pdf

    最后,JMH(Java Microbenchmark Harness)是一个用于基准测试的框架,它可以帮助开发者编写简单、准确的性能测试代码。Disruptor是一个高性能的事件处理框架,它使用环形数组结构来处理事件,可以在单机环境下提供...

    Disruptor学习.7z

    3. **性能测试**:对比使用Disruptor前后的性能,理解其在高并发场景下的优势。 4. **深入研究**:学习Disruptor的高级特性,如工作窃取策略、事件工厂和事件处理器链等。 总之,Disruptor是Java并发编程领域的一...

    JAVA并发编程深度学习-无锁并行计算框架1

    测试结果显示,Disruptor处理相同数量的消息仅花费7458毫秒,明显优于ArrayBlockingQueue,这体现了Disruptor在高并发处理中的优势。 Disruptor的主要特性包括: 1. **无锁设计**:Disruptor使用了序列号...

    Disruptor.zip

    总的来说,Disruptor是Android开发者应对高并发挑战的一个强大工具,它的出现改变了我们对并发编程的认知,提供了一种新的优化并发性能的方法。通过深入学习和实践,开发者可以更好地利用Disruptor,为Android应用...

    disruptor concurency pattern in c++.zip

    《Disruptor并发模式在C++中...通过理解和掌握这一模式,开发者能够在处理高并发场景时,实现更流畅、更快速的系统性能。在实践中,我们需要根据具体的应用场景和需求,灵活运用Disruptor模式,以达到最优的并发性能。

    disruptor:LMAX干扰器的C++实现

    LMAX Disruptor是由LMAX公司开发的一款高性能、低延迟的消息传递框架,最初是用Java编写的。它的核心设计理念是通过消除传统锁机制,采用无锁数据结构和单向事件传递路径,以达到极致的并发性能。在本文中,我们将...

    并发编程demo

    在IT行业中,并发编程是提升系统性能和效率的关键技术,特别是在多核处理器和高并发应用场景中。本项目“并发编程demo”聚焦于Java平台上的并发处理,主要利用了`java.util.concurrent`包中的工具和机制。这个包包含...

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

    而Log4j2的一个显著特性是支持异步日志写入,这种模式可以显著提高系统的整体性能,特别是在高并发环境下。 本文主要探讨Log4j2异步写日志的效率,通过源码分析和测试来展示其优势。首先,我们要理解Log4j2中的异步...

    log4j2 demo 性能测试

    相比传统的同步日志记录,Log4j2引入了异步日志记录模式,这一特性使得日志处理速度显著提升,尤其在高并发场景下,能够避免日志记录成为系统性能瓶颈。 Log4j2的核心组件包括配置器、日志事件、布局和Appender。...

    myDisruptor.zip

    《Disruptor框架详解——基于myDisruptor.zip资源》 Disruptor是英国LMAX公司开发的一款高性能、低延迟的并发处理框架,它通过...在实际项目中,尤其是在高并发、低延迟的场景下,Disruptor是值得考虑和采用的利器。

    Java高级开发学习路径.pdf

    在并发编程方面,文档涉及了JUC并发工具包、无锁并发框架Disruptor和线程基础与高级特性,这些都是提升Java并发处理能力的必备知识点。 此外,文档还包含Java虚拟机(JVM)深入知识的学习路径,如内存模型、垃圾...

    LMAX Disruptor:高性能线程间消息传递库-开源

    LMAX旨在成为世界上最快的交易平台。 显然,为了实现这一目标,我们需要做一些特殊的事情,... Disruptor是一种通用机制,用于解决并发编程中的难题。 它的工作方式与传统方法不同,因此您使用它的方式可能会有所不同。

    xd-toolkit:工具集(工作过程中常用到的工具类、工具模块)

    b、对于业务逻辑简单,要求高并发高响应的场景,改组件同样适用,经测试,在同等条件下, 吞吐率比Disruptor快10倍以上 工具类 cn.com.common.util.concurrent.spmc.original.OriginalSpmc 测试类(可作为使用示例...

    matching-engine:使用Disruptor设计模式匹配Java后端的订单

    Disruptor是由LMAX公司开发的一种高性能的并发数据处理框架,它通过消除锁和减少内存屏障来实现极低的延迟。在订单匹配引擎中,Disruptor可以作为事件处理器,高效地管理订单的创建、匹配和取消等操作。 首先,理解...

Global site tag (gtag.js) - Google Analytics