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

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

 

测试内容:多线程

IO密集型的多线程并发计算测试。这个测试里,CPU资源再也不缺少,IO操做比较频繁。而且因为IO操做比较慢,因此线程间的block时间能够相对多些,意味着能够开更多的线程来完成计算任务。并发

 

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

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

 

可控的因子:ui

1、网络响应时间。url

因为网络访问很不稳定,为了作比较,使用Go写了个简单的httpserver, 模拟返回相关的股票价格,这样能够得到稳定的网络访问速度.spa

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

 

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

 

 

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

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

 

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

相关文章
相关标签/搜索