2012-07-07 84 views
0

我正在一个java应用程序有一个生产者 - 消费者模式。早些时候,制作人没有按顺序制作事件(例如,'2'是在'1'之前制作的,但消费者必须按顺序发送它们(例如,'1',然后'2',然后'3'等)。为了说明这个问题,TreeSet被用来维护一个队列,并且为了查看和删除这些元素,在遍历上也是这样做的。到现在为止还挺好。改变的是生产者现在按顺序生成事件,因此我决定使用: -Java分析的可伸缩性和时间复杂性

a)一个LinkedBlockingQueue(它具有队列的基本属性,其中只能访问第一个和最后一个元素,如它应该是一个队列)。 b)使用LBQ使我从树中的O(log n)到O(1)。

c)我不必再写明确的同步了,ReentrantLock负责LBQ的放入和取出方法。

d)我不再需要写明确的等待/通知,LBQ负责处理这个问题。 e)LBQ有2个锁,因此put和take可以同时在不同的CPU上运行。 f)LBQ使用CAS来维护等待线程队列。

所有的事情对我来说都很好。但我卡住了,下面是一些问题: -

a)我需要通过收集一些指标来证明在TreeSet上使用LBQ的优势。我应该在我的eclipse中使用哪个免费的分析器? Visual VM很好,但有没有更好的选择?(Introscope将用于我的应用程序的显式运行,而不是在我的本地eclipse上,这是我无法抗争的一个限制,TPTP被拒绝)。

b)由于在LinkedBlockingQueue中使用了2个锁,我该如何证明吞吐量(看起来在纸上)的增加?这是我希望看到并证明的一个重要方面。

感谢

+0

你最终使用的是什么 – 2012-07-13 23:37:30

回答

0

想,如果你已经看过的Perf4(其graphingstatistics附加器一起),用于测量/显示性能统计(http://perf4j.codehaus.org/)。如果由于某种原因不可行,请分享为什么它可能有用。

此外,您可以查看指标(http://metrics.codahale.com/)以及heapster &鸵鸟(如果可能的话)堆(性能测量)(https:// github的.com/mariusaeriksen/heapster)。使用指标,您可以依靠石墨或神经节显示(如果不使用JMX)。

希望这会有所帮助。

+0

将有一个看看,让你知道肯定。但是,衡量一下我的应用程序的吞吐量是否增加了什么指标呢?也有你用他们与日食? – 100pipers 2012-07-07 16:39:20

+0

嗨 - 它更简单,如果你使用maven(无论是perf4j还是codahale指标)。对于perf4j,你应该能够下载jar文件并继续进行,除非我的记忆让我失望。对于简单的测试,使用最小/最大/标准偏差/计数(在可能的情况下以图形格式)将在与其他人分享时帮助您处理。 – 2012-07-07 17:27:44

0

如果要显示内存/线程的使用情况,您可以尝试使用visual vm或netbeans分析器。

0

我用JMeter做过类似的负载测试。它也可以(但我没有这样做)轻松计算throughput。就我而言,我必须编写一个Java Request Java Request采样器,它充当我的被测系统的客户端。 Java请求采样器的结果可以容易地由JMeter的听众graphed(并且那些显示吞吐量)。这听起来像你可能需要做同样的事情。他们确实有TCP,HTTP等盒子采样器,尽管你可以使用。