Java、Scala和Go語言多線程並發對比測試結果和結論

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

前面的內容請看:Java、Scala和Go語言多線程並發對比測試。  相關的代碼下載:http://qinhui99.itpub.net/resource/2570/31876

測試結果和結論

統計1~N個自然數裡面有多少個質數,並記錄所花費時間。相同的N,時間越少效能越好。

AMD 雙核 2.8G ,4G記憶體 winxp

               java+conc java+AKKA1.3java+AKKA2.0 Scala+AKKA1.3Scala+AKKA2.0 Go+goroutine

1-N 單位:秒

1000000         0.64         1.14                 0.63             1.05                     0.65             0.617

2000000         1.71         2.08                 1.58             2.05                     1.68             1.63

3000000         3.05         3.28                 2.79             3.3                      2.96             2.91

5000000         6.32         6.18                 5.75             6.367                   6.1              6.04

10000000        17.14      15.85               15.8             16.5                     16.6             16.35

12000000         22.4       20.48               20.2             21.32                   21.48             21.3

(由於AMD硬體平台效能很爛,測試時間較長,所以只測試到12000000)

 

INETL 平台 酷睿雙核2.4G ,4G記憶體 winxp

       java+concurrentjava+AKKA1.3 java+AKKA2.0Scala+ AKKA1.3 Scala+ AKKA2.0Go+goroutine

1-N 單位:秒

1000000     0.209             0.87             0.235             0.73                     0.219             0.28

2000000     0.53             1.12               0.48                 0.98                     0.485             0.54

5000000     1.93             2.19               1.55                 2.08                     1.61             1.65

10000000     4.93             4.62             4.09                 4.57                     4.1             4.18

20000000     13.25         11.14             10.95                 11.13             10.92             10.98

30000000     23.24         19.37             19.13                 19.25             19.35             19.39


測試真是又費時間又枯燥的事情。在兩個硬體平台測試了之後,還有一個蘋果系統的沒有時間進行測試,先放著,等以後再補上吧。

 

效能測試結果說明:

1、  為了公平起見,各個組合的演算法都是採用給多線程傳遞不變的參數,避免使用同步鎖,盡量減少因為實現語言的不同而影響效能的因素。

2、  效能表現最好的前3個分別是:java+AKKA2.0,Scala+AKKA2.0,Go+goroutine。這3個組合的多線程並發計算指標比較接近。儘管在測試前,對Go語言報了很大期望,以為Go會是測試的冠軍,但事實證明,對這個CPU密集運算的多線程並發測試案例來說,Go並不佔優勢,甚至不如java+AKKA2.0組合。這也證明了AKKA這個高效能並發運算架構果然很優異。不瞭解AKKA2.0的朋友,請訪問:http://www.gtan.com/akka_doc/index.html。

 

3、  效能表現最常的是java+concurrent。當計算量小的時候,例如,1000000以下的時候,java+concurrent表現還不錯。但計算量不斷增大的時候,java+concurrent開始表現糟糕。在10000000以上的時候,java+concurrent表現更加糟糕。表現糟糕的原因可能是因為用到了 concurrent 的ExecutorService和Future。 Future其實是一種阻塞線程模式,所以效能並不是最佳。有時間讀讀AKKA2.0的原始碼,也許能找到一些改進效能的參考辦法。

 

4、  效能表現一般的是java+AKKA1.3和Scala+AKKA1.3。它們和AKKA2.0版本的最大差異是,它們採用的是發送並等待返回訊息的阻塞模式,而AKKA2.0版本則採用發送就不管了的無阻塞模式。事實證明,阻塞模式比無阻塞模式效能要差不少。此外,儘管AKKA1.3的阻塞模式效能不好,但在大計算量的情況下表現仍然不錯,和Go語言差不多,比java+concurrent要好。

 

5、  在運行java程式的時候,都加上了-server參數。而對於Scala和Go,我不瞭解該怎麼最佳化,所以都只是使用Scala和Go普通的運行命令來啟動程式。例如,

java -server org.aos.concurrent.samples.ConcurrentPrimeFinder 1000000 10 100

scala com.agiledeveloper.pcj.Primes 1000000 100

test_prime.exe -n=1000000 -workers=100

 

編程的難易程度測試結果說明:

1、  由於本人有多年的JAVA編程經驗,所以java+concurrent組合是編碼花費時間最少的。

 

2、  對於Scala和Go語言,本人學習的時間都差不多,3個星期左右。由於Scala和JAVA平台的互連性,也由於Scala平台的成熟和易用(開發工具和文法比Go好不少),所以開發Scala版本比Go版本所花費的時間要少。

 

3、  Scala+AKKA1.3比Scala+AKKA2.0版本更容易開發。因為Scala+AKKA1.3的阻塞模式容易理解,代碼量也少。但阻塞模式在計算量比較大的時候,容易報timeout異常。需要增加一個akka.conf檔案來定義更長的阻塞等待時間。對於Scala+AKKA2.0,AKKA官方提供了一個無阻塞模式的參考例子,採用master+worker+listener對象組合。Master分發多份工作給多個worker去計算, worker計算完後,分別把各自計算結果發回給master來匯總,最終,master把匯總結果發送給listener,並輸出結果。為了使用這種對象組合,導致Scala+AKKA2.0版本的編碼要比Scala+AKKA1.3版本複雜,花費的時間也相應要多些。另外,由於AKKA2.0採用無阻塞的模式,所以測試中沒有出現過由於計算量大而出現的timeout問題。

 

4、  從Scala轉到Java版本,確實有些困難,但幸好兩個平台是互連的,並且有參考的例子,所以轉過來也不是太困難。和Scala版本一樣的,java+AKKA1.3版本比java+AKKA2.0版本要容易寫些,也存在著阻塞模式的timeout問題。

 

5、  Go語言版本,由於和Java平台不互連,而且差異極大,編碼花費時間最多。Go語言從Scala和Python等語言裡擷取了許多有益的東西,文法比較簡潔,編譯速度快,佔用記憶體少,而且以goroutine的方式很方便地寫出支援多線程並發計算的程式,確實很有發展前景。(在用過Scala和Go語言之後,真的很討厭JAVA裡面冗長的代碼,特別是該死的分號‘;’)

但Go語言的缺陷也挺多的。這裡就列幾個測試所發現的情況:1)語言比較新,懂的人不多。這意味著學習成本和用人成本比較高;2)開發平台不成熟,在windows下安裝配置Go的開發環境,本人的經曆很痛苦。有一種當年用EditPlus寫JAVA代碼的感覺,很不爽。3)強型別轉換,很煩人。為了使用math.Sqrt,居然逼我寫了一段從float64轉int的代碼。在Java和Scala從未出現這樣的情況。算是明白了,Go所謂的編譯快其實就是程式員自己多付出點代價來照看代碼。4)goroutine容易出現deadlock死結現象。死結的原因很多,讓初學者頭痛。

 

 

測試的最終結論:

 

綜合效能測試和編碼難易程度測試結果,本人從做項目的角度得出幾點結論:

1、 對於Java程式員,如果沒有強制性的必要,不需要轉到Scala和Go語言,因為Java+AKKA2.0足夠好用了,足以應付多線程高並發應用。

2、 對於Java程式員,如果程式應用於一般的多線程應用,並且效能要求不高,java的concurrent包也夠用了。

3、 對於Java程式員,如果想讓項目的代碼量減少一半,學習成本不太高,效能也有保障的話,Scala語言是非常好的選擇。

4、 對於Java程式員,如果項目時間有限,想要用Go語言來實現項目,那基本死路一條。

5、 對於Go語言的未來,也許如Go程式設計語言QQ群裡的朋友所說的那樣,在雲端運算領域可能會大放光彩。

 

由於能力、精力和資源有限,這次比較測試並不完美,可能存在不少問題。歡迎有興趣的朋友討論並發表意見。
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.