漢辰攻略

          The palest ink is better than the best memory.

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            8 Posts :: 1 Stories :: 3 Comments :: 0 Trackbacks
          Fork-join framework是Java 7并行庫的新內容,基于divide-and-conquer算法來處理大數據量計算。DnQ是處理微粒度并行計算(數據量大,單位運行時間短)的理想模式。數據量在達到一個預定義的門檻之前,被分割成多個任務被Worker threads執行。因為現代Java虛擬機都把Java thread映射到系統線程或LWP(Light-weight process) ,同時Worker數量一般設定等同于CPU個數,這樣在多核的硬件系統中能充分利用多個CPU的計算能力。

          寫了一個MergeSort的測試例子,最終的排序用的是Java Collection Framework 自帶的Arrays.sort()。在自己雙核機器試了試,發現提升不是特別明顯。Arrays.sort 本身很高效,Framework有thread之間協作和管理worker pool的開銷,所以必須選擇一個適合的數據量闞值。下面是運行結果:

          java -Xms64m -Xmx128m -cp C;/forkjoin/jsr166y.zip;C:/workspace/java.tij forkjoin.SortTask

          Number of processor 2
          =================Sequential ===================
          Sorting takes 2617701971 to complete
          =================ForkJoin ====================
          Sorting takes 2284940405 to complete

          找不到更多核的機器,有條件的同學可以測試一把。另外,Brain Goetz (Java Concurrency in Practice作者) 的文章可參考,他的測試例子顯示了不錯的性能提升(最高17倍在32cpu系統),一般4核或8核的能達到3倍或5倍的SPEEDUP

          Java thread and practice: Stick a fork in it Part 1 - http://www.ibm.com/developerworks/java/library/j-jtp11137.html

          package forkjoin;

          import jsr166y.forkjoin.RecursiveAction;
          import jsr166y.forkjoin.ForkJoinPool;
          import java.util.Random;
          import java.util.Arrays;

          public class SortTask extends RecursiveAction {

              
          final static int ARRAY_LENGTH = 10000000;

              
          final static int THRESHOLD = 3000000;

              
          final int[] array;

              
          final int lo;

              
          final int hi;

              
          public SortTask(int[] array, int lo, int hi) {
                  
          this.array = array;
                  
          this.lo = lo;
                  
          this.hi = hi;
              }


              
          private void sequentiallySort(int[] array, int lo, int hi) {
                  
          int[] units = new int[hi - lo + 1];
                  
          for (int i = lo; i <= hi; i++)
                      units[i 
          - lo] = array[i];
                  Arrays.sort(units);
                  
          for (int i = lo; i <= hi; i++)
                      array[i] 
          = units[i - lo];
              }


              
          private void merge(int[] array, int lo, int mid, int hi) {

                  
          int[] units = new int[hi - lo + 1];
                  
          int i = lo;
                  
          int j = mid + 1;

                  
          for (int k = 0; k < units.length; k++{
                      
          if (array[i] <= array[j])
                          units[k] 
          = array[i++];
                      
          else if (array[i] > array[j])
                          units[k] 
          = array[j++];

                      
          if (i > mid)
                          
          for (int m = j; m <= hi; m++)
                              units[
          ++k] = array[m];
                      
          else if (j > hi)
                          
          for (int m = i; m <= mid; m++)
                              units[
          ++k] = array[m];
                  }


                  
          for (int k = lo; k <= hi; k++)
                      array[k] 
          = units[k - lo];

              }


              
          protected void compute() {
                  
          try {
                      
          if (hi - lo < THRESHOLD)
                          sequentiallySort(array, lo, hi);
                      
          else {
                          
          int mid = (lo + hi) >>> 1;
                          
          //System.out.println(mid);
                          forkJoin(new SortTask(array, lo, mid), new SortTask(array, mid + 1, hi));

                          merge(array, lo, mid, hi);
                      }

                  }
           catch (Throwable t) {
                      t.printStackTrace();
                  }

              }


              
          /**
               * 
          @param args
               
          */

              
          public static void main(String[] args) {
                  
          int[] sample = new int[ARRAY_LENGTH];

                  System.out.println(
          "Number of processor"
                          
          + Runtime.getRuntime().availableProcessors());
                  
                  Random seed 
          = new Random(47);

                  
          for (int i = 0; i < sample.length; i++{
                      sample[i] 
          = seed.nextInt();
                  }


                  
          long start = System.nanoTime();
                  Arrays.sort(sample);
                  
          long duration = System.nanoTime() - start;


                  System.out.println(
          "===============Sequential==================");
                  System.out.println(
          "Sorting takes " + duration + " to compelte");

                  
          int[] sample2 = new int[ARRAY_LENGTH];

                  
          for (int i = 0; i < sample2.length; i++{
                      sample2[i] 
          = seed.nextInt();
                  }


                  ForkJoinPool pool 
          = new ForkJoinPool(Runtime.getRuntime()
                          .availableProcessors());
                  SortTask st 
          = new SortTask(sample2, 0, sample2.length - 1);

                  start 
          = System.nanoTime();
                  pool.execute(st);
                  
          while (!st.isDone()) {
                  }

                  duration 
          = System.nanoTime() - start;

                  System.out.println(
          "===============ForkJoin==================");
                  System.out.println(
          "Sorting takes " + duration + " to compelte");
                  
              }


          }


          posted on 2008-06-26 10:11 漢辰 閱讀(1322) 評論(2)  編輯  收藏

          Feedback

          # re: Fork-join Framework 2009-03-30 17:03 f
          請問這個方法在什么地方
          forkJoin();
          謝謝.  回復  更多評論
            

          # re: Fork-join Framework 2009-03-31 09:52 漢辰
          @f
          是SortTask所繼承的上層抽象類中的一個方法  回復  更多評論
            


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 得荣县| 湘阴县| 双城市| 句容市| 渭南市| 来宾市| 兰溪市| 浦东新区| 永宁县| 泾源县| 德化县| 房山区| 阿巴嘎旗| 汝阳县| 新田县| 威海市| 焉耆| 镶黄旗| 瑞安市| 崇文区| 河源市| 泗洪县| 桃江县| 穆棱市| 林芝县| 射阳县| 西贡区| 台州市| 阜南县| 禹州市| 乐业县| 清镇市| 南华县| 沧源| 中超| 正宁县| 麦盖提县| 阿拉善左旗| 洛阳市| 沁水县| 环江|