以前做过一次Go和Java的多线程并发对比测试(Java、Scala和Go语言多线程并发对比测试)。当时,测试所采用的例子是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