锁定老帖子 主题:服务器端利器--双缓冲队列
精华帖 (0) :: 良好帖 (6) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-06-23
怎麼感觉和GC的YOUNG代很类似
两个S相互拷贝 想法真的听不错,有没有现成的模式? |
|
返回顶楼 | |
发表时间:2010-06-23
beneo 写道 怎麼感觉和GC的YOUNG代很类似
两个S相互拷贝 想法真的听不错,有没有现成的模式? 队列切换不通过拷贝实现,只是指针引用的切换,因此基本没开销。 什么现成的模式?若指实现的话见附件源码包。 |
|
返回顶楼 | |
发表时间:2010-06-23
最后修改:2010-06-23
囧囧有神 写道 sky3380 写道 囧囧有神 写道 再增加一个中间队列等效于给队列扩容,空间换时间,性能肯定能有所提高, 不过还是避免不了读写线程相互等待的,当读队列还没读空,写队列已写满,而中间队列也已满的时候, 写线程就得等待。 我的意思是可能出现这种情况:在读写的速度不一样的情况下,写队列满了,而读队列还没空,这时写队列与中间队列交换,等读队列空了,再把读队列与中间队列交换,这样可以减少读写线程的相互等待了。 同样大小的缓冲区,比如双缓冲队列,每队长N,读写队列一共是2N, 把这2N个空间分成三个队列应该能够提高一定的吞吐量,特别如你所说写速度大于读速度时候, 谁有时间可以帮忙测下这个场景,对于三个队列间的切换要做的灵巧些,不要产生额外的切换开销 那请问测试中java.util.concurrent.ArrayBlockingQueue和LZ自己实现的双缓冲队列设置的大小是否是一样的,如果双缓冲队列占用空间是ArrayBlockingQueue的两倍,我觉得得出的测试数据没有太大的可比性。 |
|
返回顶楼 | |
发表时间:2010-06-23
最后修改:2010-06-23
seraphim871211 写道 囧囧有神 写道 sky3380 写道 囧囧有神 写道 再增加一个中间队列等效于给队列扩容,空间换时间,性能肯定能有所提高, 不过还是避免不了读写线程相互等待的,当读队列还没读空,写队列已写满,而中间队列也已满的时候, 写线程就得等待。 我的意思是可能出现这种情况:在读写的速度不一样的情况下,写队列满了,而读队列还没空,这时写队列与中间队列交换,等读队列空了,再把读队列与中间队列交换,这样可以减少读写线程的相互等待了。 同样大小的缓冲区,比如双缓冲队列,每队长N,读写队列一共是2N, 把这2N个空间分成三个队列应该能够提高一定的吞吐量,特别如你所说写速度大于读速度时候, 谁有时间可以帮忙测下这个场景,对于三个队列间的切换要做的灵巧些,不要产生额外的切换开销 那请问测试中java.util.concurrent.ArrayBlockingQueue和LZ自己实现的双缓冲队列设置的大小是否是一样的,如果双缓冲队列占用空间是ArrayBlockingQueue的两倍,我觉得得出的测试数据没有太大的可比性。 双缓冲队列总的大小是ArrayBlockingQueue的两倍,总的思想是以空间换时间, 不过这个性能和容量设置没多大关系,就算ArrayBlockingQueue容量设成双缓冲 队列两倍性能也不会有多大提高,双缓冲队列要解决的是读写同步开销问题,不能单纯 靠提升容量就解决 |
|
返回顶楼 | |
发表时间:2010-06-23
最后修改:2010-06-23
我觉得想法挺好的。
不过不知道有什么应用场景?你所优化的时间是产品从产生出来后到交付到消费者手里的时间(这个比喻太失败了),这只是占产品从生产到消费整个时间的一小部分。 你自己也看到了,1000W个数据才有2秒的提升。 |
|
返回顶楼 | |
发表时间:2010-06-23
beneo 写道 我觉得想法挺好的。
不过不知道有什么应用场景?你所优化的时间是产品从产生出来后到交付到消费者手里的时间(这个比喻太失败了),这只是占产品从生产到消费整个时间的一小部分。 你自己也看到了,1000W个数据才有2秒的提升。 在高并发的系统中队列作为重要的基础组件,其性能的提高对提高系统整体性能 是有意义的,这里纯粹是基础组件,就像java中的util包里头的类一样,和业务 关系不大,完成1000w个数据的入队出队总共花了30多秒,但却有12秒的提升,你自己算算性能提高了多少 |
|
返回顶楼 | |
发表时间:2010-06-23
囧囧有神 写道 beneo 写道 我觉得想法挺好的。
不过不知道有什么应用场景?你所优化的时间是产品从产生出来后到交付到消费者手里的时间(这个比喻太失败了),这只是占产品从生产到消费整个时间的一小部分。 你自己也看到了,1000W个数据才有2秒的提升。 在高并发的系统中队列作为重要的基础组件,其性能的提高对提高系统整体性能 是有意义的,这里纯粹是基础组件,就像java中的util包里头的类一样,和业务 关系不大,完成1000w个数据的入队出队总共花了30多秒,但却有12秒的提升,你自己算算性能提高了多少 好吧,这玩意的确很棒 |
|
返回顶楼 | |
发表时间:2010-06-23
囧囧有神 写道 双缓冲队列总的大小是ArrayBlockingQueue的两倍,总的思想是以空间换时间, 不过这个性能和容量设置没多大关系,就算ArrayBlockingQueue容量设成双缓冲 队列两倍性能也不会有多大提高,双缓冲队列要解决的是读写同步开销问题,不能单纯 靠提升容量就解决 啊,明白了,是不是可以这样理解,这种方式不太适合写速度远大于读速度的场景。 |
|
返回顶楼 | |
发表时间:2010-06-23
seraphim871211 写道 囧囧有神 写道 双缓冲队列总的大小是ArrayBlockingQueue的两倍,总的思想是以空间换时间, 不过这个性能和容量设置没多大关系,就算ArrayBlockingQueue容量设成双缓冲 队列两倍性能也不会有多大提高,双缓冲队列要解决的是读写同步开销问题,不能单纯 靠提升容量就解决 啊,明白了,是不是可以这样理解,这种方式不太适合写速度远大于读速度的场景。 如果写速度远大于读速度,就应该增加读线程数了 |
|
返回顶楼 | |
发表时间:2010-06-23
sky3380 写道 seraphim871211 写道 囧囧有神 写道 双缓冲队列总的大小是ArrayBlockingQueue的两倍,总的思想是以空间换时间, 不过这个性能和容量设置没多大关系,就算ArrayBlockingQueue容量设成双缓冲 队列两倍性能也不会有多大提高,双缓冲队列要解决的是读写同步开销问题,不能单纯 靠提升容量就解决 啊,明白了,是不是可以这样理解,这种方式不太适合写速度远大于读速度的场景。 如果写速度远大于读速度,就应该增加读线程数了 嗯~~ |
|
返回顶楼 | |