Disruptor困惑之性能

是这样,我写了一段测试代码用来测试disruptor在多个生产者对应一个消费者处理模式下的性能,代码很简单:
public static void main(String[] args) throws Exception {
int publisherNum = 50000;
Executor executor = Executors.newCachedThreadPool();
Disruptor<ValueEvent> disruptor = new Disruptor<ValueEvent>(
ValueEvent.EVENT_FACTORY, executor, new
MultiThreadedLowContentionClaimStrategy(4),new YieldingWaitStrategy() );

disruptor.handleEventsWith(new Customer());
RingBuffer<ValueEvent> ringBuffer = disruptor.start();

for (int i=0; i<publisherNum; i++) {
long sequence = ringBuffer.next();
ValueEvent event = ringBuffer.get(sequence);
executor.execute(new Publisher(ringBuffer, sequence));
}
}
其中Customer实现了EventHandler。在onEvent方法中只是打印输出,表示收到消息。
可是整个循环运行下来大概用了5分钟左右。

所以我对于Disruptor提到过的每秒6百万的处理能力不知道该如何去理解?还是说我这样的测试方法根本就有问题?
还请各位高手能够解释一下。谢谢大家!

对,您说的没错YieldWaitStrategy是很占CPU,但是我测试下来,好像并不是这个原因。
以上测试是在我的个人PC上,当我将其放在服务器上测试70000条记录用时是184milliseconds。这要远高于在我个人PC上的测试结果15秒。
另外,我发现用YieldWaitStrategy好像要比Sleep策略快,虽然它很占CPU。
除此以外,还有一点也值得注意,那就是对于ClaimStrategy中bufferSize的设置,对于测试结果相差也很大。
想请问一下banq,您一般对于bufferSize的设置是多少?或者官方有没有给出建议的取值(好像没有查到)?谢谢。
[该贴被abel1978于2012-04-23 11:22修改过]

2012-04-23 11:14 "@abel1978"的内容
您一般对于bufferSize的设置是多少? ...

bufferSize实际是Queue大小,根据你一轮发射大概多少颗子弹,就使用多大,尽量大,然后注意控制内存溢出,监视JVM的旧生代,减少旧生代垃圾回收机制启动即可。

我认为LZ的测试程序跟Disruptor的思想有些背道而驰。 Disruptor的思想我认为就是尽量让一个CPU只做一件事,不被打断。 也就是一个批处理的过程。 如此多的生产者光是线程切换都是不小的负担。

最新的Disruptor的src里带了性能测试程序,可以参考。


你的buffer size 跟你的 publisher 相差那么悬殊,一旦slot不够用,各个线程就会等待, 再者 你的publisher循环里面调用ringBuffer.next(); 这基本上就相当于你的publisher顺序执行了