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計算密集型,每一個線程只是執行一小段時間的多線程任務,非阻塞式的模式性能要佔優點。

相關文章
相關標籤/搜索