<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    漢辰攻略

    The palest ink is better than the best memory.

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

    寫了一個(gè)MergeSort的測(cè)試?yán)樱罱K的排序用的是Java Collection Framework 自帶的Arrays.sort()。在自己雙核機(jī)器試了試,發(fā)現(xiàn)提升不是特別明顯。Arrays.sort 本身很高效,F(xiàn)ramework有thread之間協(xié)作和管理worker pool的開銷,所以必須選擇一個(gè)適合的數(shù)據(jù)量闞值。下面是運(yùn)行結(jié)果:

    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

    找不到更多核的機(jī)器,有條件的同學(xué)可以測(cè)試一把。另外,Brain Goetz (Java Concurrency in Practice作者) 的文章可參考,他的測(cè)試?yán)语@示了不錯(cuò)的性能提升(最高17倍在32cpu系統(tǒng)),一般4核或8核的能達(dá)到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 漢辰 閱讀(1320) 評(píng)論(2)  編輯  收藏

    Feedback

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

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


    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 亚洲av区一区二区三| 亚洲成人黄色网址| 在线免费观看h片| 亚洲欧洲无码AV电影在线观看| 亚洲av午夜福利精品一区人妖| APP在线免费观看视频| 全免费a级毛片免费**视频| 亚洲色欲久久久久综合网| 亚洲精品成人久久| 日本在线高清免费爱做网站| 在线aⅴ亚洲中文字幕| 中文字幕乱码免费看电影| 久久久久亚洲AV片无码| 1区2区3区产品乱码免费| 久久久久亚洲爆乳少妇无 | 亚洲日韩精品无码专区加勒比☆ | 亚洲依依成人精品| 全部免费毛片在线播放| 亚洲情侣偷拍精品| 成人免费视频一区二区| 在线免费观看一区二区三区| 国产精品久久亚洲一区二区| 久久久久久99av无码免费网站| 无码乱人伦一区二区亚洲一| 女人张开腿等男人桶免费视频| 久久免费视频一区| 亚洲日韩精品A∨片无码加勒比| 亚洲av之男人的天堂网站| 最近免费中文字幕4| 亚洲人成色777777老人头| 亚洲综合国产一区二区三区| 日韩黄色免费观看| 免费国产作爱视频网站| 久久免费福利视频| 一区二区三区免费高清视频| 亚洲啪啪AV无码片| 国产亚洲大尺度无码无码专线 | 亚洲av无码一区二区三区乱子伦| 免费一级e一片在线播放| 国产精品成人免费福利| 亚洲欧美自偷自拍另类视|