JAVA和Go语言的多线程并发测试二

原创
2012/06/05 09:05
阅读数 4.6K

以前做过一次GoJava的多线程并发对比测试(JavaScalaGo语言多线程并发对比测试)。当时,测试所采用的例子是CPU运算密集型的,会占用大量的CPU资源。测试的结果Go并不占优势,可能的原因是,因为CPU资源稀少,Go采用阻塞模式的多线程工作效率比不上AKKA的无阻塞模式。也就是说,对于CPU运算密集型的情况,Go的多线程并发计算没有优势。可是,我以前做过读写文件和大循环的性能对比测试,发现Go都比Java要强,所以有理由相信在多线程并发的时候,Go不应该这么差的表现。为了验证Go的多线程优势,我又做了一次多线程并发对比测试.

 

测试内容:

IO密集型的多线程并发计算测试。这个测试里,CPU资源不再缺乏,IO操作比较频繁。并且由于IO操作比较慢,所以线程间的block时间可以相对多些,意味着可以开更多的线程来完成计算任务。

 

具体任务:首先,程序从一个本地文本文件里面读取相关的股票代码以及股票对应数量. 然后,再通过网络动态获取股票当前的价格,并汇总所有股票的总价值.

(从理论上讲,读取文件,循环遍历和快速启动多线程任务,都是Go的优势)

 

可控的因子:

1、网络响应时间。

由于网络访问很不稳定,为了做比较,使用Go写了个简单的httpserver, 模拟返回相关的股票价格,这样可以获得稳定的网络访问速度.

为了模拟较长的计算时间,采用让每次url访问休眠固定毫秒的方法。休眠时间越长,响应就越慢。 通过调节不同的休眠时间,来做不同的性能对比测试.

 

2、文本文件的股票行数。行数越多,处理计算量越大。

 

 

为了对比,我做了3种实现方案, 分别是: JAVA+AKKA2.0非阻塞模式

, JAVA+AKKA2.0阻塞模式, Go+goroutine

 

经过设置不同的网络响应时间和股票行数做了多组测试,测试结果和预期是吻合的。Go+goroutine是性能最好的。股票行数越多,网络响应时间越长,Go的优势就更明显。JAVA+AKKA2.0阻塞模式比JAVA+AKKA2.0非阻塞模式性能稍好些,这也验证了我早期做的一次测试:线程的阻塞模式好,还是非阻塞模式好呢? 对于这种非CPU计算密集型,每个线程只是执行一小段时间的多线程任务,非阻塞式的模式性能要占优势。

展开阅读全文
打赏
1
5 收藏
分享
加载中
请问go+goroutine优势很大么?差异有多大呢?可以找到测试结果么?对于上文的测试非阻塞式的模式性能要占优势吧?就是说:JAVA+AKKA2.0非阻塞模式比JAVA+AKKA2.0阻塞模式性能稍好些,是么?
2014/11/15 22:55
回复
举报
JAVA+AKKA2.0阻塞模式比JAVA+AKKA2.0非阻塞模式性能稍好些?
2012/11/29 19:26
回复
举报
qinhui99博主
等有时间再看看它,目前主要精力在研究Go语言和AKKA。
2012/06/07 20:29
回复
举报
谢谢分享,另外兄弟有兴趣测测JActor吗(http://www.oschina.net/p/jactor),看作者吹的挺牛X的

2012/06/07 16:26
回复
举报
更多评论
打赏
4 评论
5 收藏
1
分享
返回顶部
顶部