论坛首页 Java企业应用论坛

服务器端利器--双缓冲队列

浏览 17540 次
精华帖 (0) :: 良好帖 (6) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-06-23  
怎麼感觉和GC的YOUNG代很类似

两个S相互拷贝

想法真的听不错,有没有现成的模式?
0 请登录后投票
   发表时间:2010-06-23  
beneo 写道
怎麼感觉和GC的YOUNG代很类似

两个S相互拷贝

想法真的听不错,有没有现成的模式?

队列切换不通过拷贝实现,只是指针引用的切换,因此基本没开销。
什么现成的模式?若指实现的话见附件源码包。
0 请登录后投票
   发表时间:2010-06-23   最后修改:2010-06-23
囧囧有神 写道
sky3380 写道
囧囧有神 写道

再增加一个中间队列等效于给队列扩容,空间换时间,性能肯定能有所提高,
不过还是避免不了读写线程相互等待的,当读队列还没读空,写队列已写满,而中间队列也已满的时候,
写线程就得等待。

我的意思是可能出现这种情况:在读写的速度不一样的情况下,写队列满了,而读队列还没空,这时写队列与中间队列交换,等读队列空了,再把读队列与中间队列交换,这样可以减少读写线程的相互等待了。


同样大小的缓冲区,比如双缓冲队列,每队长N,读写队列一共是2N,
把这2N个空间分成三个队列应该能够提高一定的吞吐量,特别如你所说写速度大于读速度时候,
谁有时间可以帮忙测下这个场景,对于三个队列间的切换要做的灵巧些,不要产生额外的切换开销


那请问测试中java.util.concurrent.ArrayBlockingQueue和LZ自己实现的双缓冲队列设置的大小是否是一样的,如果双缓冲队列占用空间是ArrayBlockingQueue的两倍,我觉得得出的测试数据没有太大的可比性。
0 请登录后投票
   发表时间:2010-06-23   最后修改:2010-06-23
seraphim871211 写道
囧囧有神 写道
sky3380 写道
囧囧有神 写道

再增加一个中间队列等效于给队列扩容,空间换时间,性能肯定能有所提高,
不过还是避免不了读写线程相互等待的,当读队列还没读空,写队列已写满,而中间队列也已满的时候,
写线程就得等待。

我的意思是可能出现这种情况:在读写的速度不一样的情况下,写队列满了,而读队列还没空,这时写队列与中间队列交换,等读队列空了,再把读队列与中间队列交换,这样可以减少读写线程的相互等待了。


同样大小的缓冲区,比如双缓冲队列,每队长N,读写队列一共是2N,
把这2N个空间分成三个队列应该能够提高一定的吞吐量,特别如你所说写速度大于读速度时候,
谁有时间可以帮忙测下这个场景,对于三个队列间的切换要做的灵巧些,不要产生额外的切换开销


那请问测试中java.util.concurrent.ArrayBlockingQueue和LZ自己实现的双缓冲队列设置的大小是否是一样的,如果双缓冲队列占用空间是ArrayBlockingQueue的两倍,我觉得得出的测试数据没有太大的可比性。


双缓冲队列总的大小是ArrayBlockingQueue的两倍,总的思想是以空间换时间,
不过这个性能和容量设置没多大关系,就算ArrayBlockingQueue容量设成双缓冲
队列两倍性能也不会有多大提高,双缓冲队列要解决的是读写同步开销问题,不能单纯
靠提升容量就解决
0 请登录后投票
   发表时间:2010-06-23   最后修改:2010-06-23
我觉得想法挺好的。

不过不知道有什么应用场景?你所优化的时间是产品从产生出来后到交付到消费者手里的时间(这个比喻太失败了),这只是占产品从生产到消费整个时间的一小部分。

你自己也看到了,1000W个数据才有2秒的提升。
0 请登录后投票
   发表时间:2010-06-23  
beneo 写道
我觉得想法挺好的。

不过不知道有什么应用场景?你所优化的时间是产品从产生出来后到交付到消费者手里的时间(这个比喻太失败了),这只是占产品从生产到消费整个时间的一小部分。

你自己也看到了,1000W个数据才有2秒的提升。


在高并发的系统中队列作为重要的基础组件,其性能的提高对提高系统整体性能
是有意义的,这里纯粹是基础组件,就像java中的util包里头的类一样,和业务
关系不大,完成1000w个数据的入队出队总共花了30多秒,但却有12秒的提升,你自己算算性能提高了多少
0 请登录后投票
   发表时间:2010-06-23  
囧囧有神 写道
beneo 写道
我觉得想法挺好的。

不过不知道有什么应用场景?你所优化的时间是产品从产生出来后到交付到消费者手里的时间(这个比喻太失败了),这只是占产品从生产到消费整个时间的一小部分。

你自己也看到了,1000W个数据才有2秒的提升。


在高并发的系统中队列作为重要的基础组件,其性能的提高对提高系统整体性能
是有意义的,这里纯粹是基础组件,就像java中的util包里头的类一样,和业务
关系不大,完成1000w个数据的入队出队总共花了30多秒,但却有12秒的提升,你自己算算性能提高了多少


好吧,这玩意的确很棒
0 请登录后投票
   发表时间:2010-06-23  
囧囧有神 写道

双缓冲队列总的大小是ArrayBlockingQueue的两倍,总的思想是以空间换时间,
不过这个性能和容量设置没多大关系,就算ArrayBlockingQueue容量设成双缓冲
队列两倍性能也不会有多大提高,双缓冲队列要解决的是读写同步开销问题,不能单纯
靠提升容量就解决


啊,明白了,是不是可以这样理解,这种方式不太适合写速度远大于读速度的场景。
0 请登录后投票
   发表时间:2010-06-23  
seraphim871211 写道
囧囧有神 写道

双缓冲队列总的大小是ArrayBlockingQueue的两倍,总的思想是以空间换时间,
不过这个性能和容量设置没多大关系,就算ArrayBlockingQueue容量设成双缓冲
队列两倍性能也不会有多大提高,双缓冲队列要解决的是读写同步开销问题,不能单纯
靠提升容量就解决


啊,明白了,是不是可以这样理解,这种方式不太适合写速度远大于读速度的场景。

如果写速度远大于读速度,就应该增加读线程数了
0 请登录后投票
   发表时间:2010-06-23  
sky3380 写道
seraphim871211 写道
囧囧有神 写道

双缓冲队列总的大小是ArrayBlockingQueue的两倍,总的思想是以空间换时间,
不过这个性能和容量设置没多大关系,就算ArrayBlockingQueue容量设成双缓冲
队列两倍性能也不会有多大提高,双缓冲队列要解决的是读写同步开销问题,不能单纯
靠提升容量就解决


啊,明白了,是不是可以这样理解,这种方式不太适合写速度远大于读速度的场景。

如果写速度远大于读速度,就应该增加读线程数了


嗯~~
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics