日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
Java與F#的并行程序處理對(duì)比

Azul System的Cliff Click博士是多核心JVM系統(tǒng)方面的專家,之前發(fā)表了一篇博文,首先比較了Java與C語言和C++的性能表現(xiàn),但同時(shí)也討論了C#和.NET。以下三個(gè)Cliffs博士的評(píng)論讓人十分感興趣:

10年積累的網(wǎng)站設(shè)計(jì)、做網(wǎng)站經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶對(duì)網(wǎng)站的新想法和需求。提供各種問題對(duì)應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先網(wǎng)站設(shè)計(jì)后付款的網(wǎng)站建設(shè)流程,更有漢壽免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。

在標(biāo)題"Places where C/C++ beats Java for obvious reasons"下:

“值類型,例如復(fù)雜類型,在Java中需要一個(gè)類來支持”

"Value Types, such as a 'Complex' type require a full object in Java." - Dr Cliff Click

Cliff忘記提及的是.NET同樣提供值對(duì)象和比復(fù)數(shù)更加引人注意的humble hash table。

考慮一下以10,000,000個(gè)整數(shù)/單精度浮點(diǎn)數(shù) 填充hash表,這個(gè)任務(wù)可以使用Java來完成,如下:

 
 
 
  1. package hashtablebenchmark;
  2. import java.util.HashMap;
  3. public class Main {
  4.     public static void main(String[] args) {
  5.         int n = 10000000;
  6.         for (int j=0; j<10; ++j) {
  7.             long startTime = System.currentTimeMillis();
  8.             HashMap hashtable = new HashMap(n);
  9.             for(int i=1; i<=n; ++i) {
  10.                 hashtable.put(i, 1.0f / i);
  11.             }
  12.             System.out.println("m[100] = " + hashtable.get(100));
  13.             long time = System.currentTimeMillis() - startTime;
  14.             System.out.println("Took: " + time / 1e3 + "s");
  15.         }
  16.     }
  17. }

同樣的程序在F#中不僅僅代碼更短并且速度要快上17倍:

 
 
 
  1. let n = 10000000
  2. let m = System.Collections.Generic.Dictionary(n)
  3. for i=1 to n do
  4.   m.[i] <- 1.0f / float32 i
  5. printf "m[100] = %f\n" m.[100]

特別值得提及的是,Java初始化花費(fèi)6.967s、穩(wěn)態(tài)花費(fèi)5.733s,而F#只用了0.414s。

實(shí)際上,F(xiàn)#通過這個(gè)測(cè)試后我們便想給它更大的工作量,而在這臺(tái)4GB內(nèi)存的機(jī)器上,Java不可能再做更多了。

在別處的評(píng)論,Cliff也這樣寫到Java:

“有非常好的多線程支持,并行程序設(shè)計(jì)在Java中很容易實(shí)現(xiàn)”

"Very Good Multi-Threading Support. Parallel programming is just easier in Java." - Dr Cliff Click

之后又有:

“并非我如此關(guān)注C#而是...我認(rèn)為JIT編碼處理基本上比Java要慢”

"Not that I track C# all that closely but... I believe the JIT produces substantially slower code than Java" - Dr Cliff Click

允許我們?cè)谄渌矫鎭碜C明,Computer Language Shootout軟包含了一個(gè)格式良好的spectral-norm測(cè)試,最快的Java解決方案是一個(gè)173行的并行程序。其實(shí)現(xiàn)用F#來寫只需要24行代碼:

 
 
 
  1. let A i j = 1.0 / float((i + j) * (i + j + 1) / 2 + i + 1)
  2. let inline mul A (u: _ []) (v: _ []) =
  3.   System.Threading.Tasks.Parallel.For(0, v.Length, fun i ->
  4.     let mutable vi = 0.0
  5.     for j = 0 to v.Length - 1 do
  6.       vi <- vi + A i j * u.[j]
  7.     v.[i] <- vi) |> ignore
  8. let AtAu u v =
  9.   let w = Array.create (Array.length u) 0.0
  10.   mul (fun i j -> A i j) u w
  11.   mul (fun i j -> A j i) w v
  12. do
  13.   let n = 5500
  14.   let u, v = Array.create n 1.0, Array.create n 0.0
  15.   for i = 0 to 9 do
  16.     AtAu u v
  17.     AtAu v u
  18.   let u, v = vector u, vector v
  19.   printf "%0.9f\n" (sqrt(Vector.dot u v / Vector.dot v v))

在Java代碼中,大量的代碼都是用來實(shí)現(xiàn)并行化。與之相反的是,F(xiàn)#在處理并行化上只用了兩行代碼??梢?,并行程序設(shè)計(jì)在Java中可不是那么easy。

Java串行程序初始花費(fèi)了12.722s穩(wěn)態(tài)花費(fèi)12.299s,而冷啟動(dòng)的F#只用了12.18s。在8核 2xE5405 2.0GHz Xeon的機(jī)器上,Java并行程序初始化花費(fèi)1.839s穩(wěn)態(tài)花費(fèi)1.820s,而冷啟動(dòng)的F#并行程序只用了1.60s。事實(shí)證明,Java在每一個(gè)測(cè)試中都表明CLR的JIT并不是“處理基本上比Java更慢”

***,Cliff并沒有提到其他兩個(gè)設(shè)計(jì)上(Java性能)的不足。首先,Java的泛型代碼導(dǎo)致性能大幅下降,由于它使用了許多不必要的裝箱操作。其次,JVM棧缺少尾部遞歸支持,這不僅僅對(duì)這個(gè)函數(shù)式編程的年代帶來越來越多的障礙,而且唯一的一般解決方案也比需要的慢上10倍。

英文連接:http://fsharpnews.blogspot.com/2010/05/java-vs-f.html


本文名稱:Java與F#的并行程序處理對(duì)比
文章出自:http://www.dlmjj.cn/article/djsddhe.html