我真的很喜欢编程并且我的软件存在性能问题。基本上我得到一些数据并在其上运行100循环(i=0;i<100;i++
)并且在该循环期间我的程序做出3个决策中的1个,保持数据处理,丢弃它或将其版本发送回队列进行处理。每个线程所做的个别工作非常小,但是有很多(这就是为什么我使用队列服务器进行水平扩展)。
我的问题是它永远不会接近我的整个cpu,我的程序每个核心运行大约40%。在分析之后,似乎大部分时间都是花费从队列发送/接收数据(在com.rabbitmq.client.impl.Frame.readFrom(DataInputStream)
和com.rabbitmq.client.impl.SocketFrameHandler.readFrame()
的部分中大约64%,大约17%是以格式获取数据对于队列(我从之前的40%下来),其余的是花在我的程序逻辑上)。显然,我希望我的工作能够更快地完成,并希望不要在队列中花费这么多时间,我想知道是否有更好的设计我可以使用。
我的代码实际上非常大,但这里概述了它的作用:
我做过的一个奇怪的事情,虽然我使用线程执行器进行确认并发送到队列,但我的主工作线程只是一个分叉线程(使用public void run()
),因为我的程序我致力于这个单一的过程,以确保总有X个线程准备工作(并且没有关闭/重新生成它们)。其余的是在线程中,因为我认为其余的可以在我的主程序运行时等待/排队。
我不确定如何更好地设计它,以便花费更少的时间收集/发送数据。有什么设计,rabbitmq,Java可以用来帮助吗?
答案 0 :(得分:1)
如果它不是IO等待,那么我怀疑这些方法内部会发生某些锁定。
在我看来,你的线程花费了大量时间等待他们返回。有点违反直觉,你可能会通过减少线程数来提高你的性能,因为他们会花更少的时间绊倒对方,花更多的时间积极做一些事情。
试一试,看看它对个人资料的影响。