聶永的博客

          記錄工作/學習的點點滴滴。

          Fork/Join模式(JSR166y)手記之斐波納契數列(Fibonacci)求解測試

          在參考資料中,對斐波納契數列(Fibonacci)進行求解來展示RecursiveTask的用法,很好。
          另外,在JSR166y演進的過程中,其算法經過調整,導致原示范代碼中存在一些問題,需要進行些許調整。歷史遺留代碼,如下:
          Fibonacci f1 = new Fibonacci(n - 1);
          f1.fork();
          Fibonacci f2 = new Fibonacci(n - 2);
          f2.fork();

          return f2.join() + f1.join();
          但現在已不建議使用。真要如此執行,會一直阻塞等待(至少我本機是如此)。查看RecursiveTask的源代碼,也發現示范doc中,兩個RecursiveTask類型結果相互匯聚,推薦示范為:
          Fibonacci f1 = new Fibonacci(n - 1);
          f1.fork();
          Fibonacci f2 = new Fibonacci(n - 2);

          return f2.compute() + f1.join();
          嗯,這里同時提供一個單線程版本的參考實現,與之作為對比:

          在測試時,發現速度太慢,于是萌生了改進了其算法的想法,于是一個非遞歸、單線程版本實現出現了:

          使用JUNIT 4進行測試類:

          該貼的代碼,都貼完了,可以預測一下哪一個算法的速度排名嗎 ?嗯,貼出運行JUNIT測試輸出結果吧:
          Fork/Join 算法 ...
          1836311903
          用時 : 2203

          單線程遞歸算法 ...
          1836311903
          用時 : 1016

          單線程改進遞增算法 ...
          1836311903
          用時 : 0
          在測試類中,把MAX設置為55或更大的數字,以上兩個算法就可能等待過長的時間(實在沒有耐心等待那么長時間),而算法三,即使設置再大,也是瞬時完成。
          上面的測試類中,把results數組以static修飾,公共共享方式,存放在常量區,在速度上會比原始測試代碼讀取方面更為迅速,快了不少。
          本機的CPU雙核的效果沒有體現出來。權威一些的解析:
          在Java 7 生命周期內,大的(32+)多核系統將大量出現,有了這個框架可以讓人們對計算密集型任務獲得相對簡單的增速方法。目前,forkjoin在如Sun Niagaras和Azuls這樣的機器上工作得最好,它們只是即將普及的并行處理器。Forkjoin在標準SMP上工作的也不錯。總體來講,少于4處理器的話你不并能獲得太多增速效果——其主要目標是針對成打到成百處理器范圍。
          另一方面,也是任務劃分過于細小,優勢體現不出來。當然,不是所有的任務都適合Fork/Join模式,以及適合多線程,就看具體任務具體分析了。
          參考資料:

          1. JDK 7 中的 Fork/Join 模式

          posted on 2012-02-07 21:24 nieyong 閱讀(1208) 評論(0)  編輯  收藏 所屬分類: Java

          公告

          所有文章皆為原創,若轉載請標明出處,謝謝~

          新浪微博,歡迎關注:

          導航

          <2012年2月>
          2930311234
          567891011
          12131415161718
          19202122232425
          26272829123
          45678910

          統計

          常用鏈接

          留言簿(58)

          隨筆分類(130)

          隨筆檔案(151)

          個人收藏

          最新隨筆

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 龙泉市| 建平县| 巴里| 临西县| 马龙县| 巴南区| 台江县| 凤凰县| 昌吉市| 芦山县| 乐亭县| 忻城县| 黑龙江省| 凤山市| 山阳县| 方正县| 乌兰察布市| 华阴市| 措勤县| 丹寨县| 水城县| 岳阳县| 长丰县| 玉屏| 通海县| 鄢陵县| 青田县| 石景山区| 囊谦县| 柘城县| 靖宇县| 蒙自县| 兖州市| 抚宁县| 双峰县| 河北省| 洛阳市| 兴仁县| 丹东市| 南丹县| 永平县|