论坛首页 Java企业应用论坛

【疑问】for循环和fork/join框架比较

浏览 2326 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2015-05-28  
jdk1.7_17
CPU Intel(R) Core(TM) i5-4200M @2.50GHz 2.49GHz
OS windows 8中文版
==============for======================
double[] nums = new double[10000000];

        for (int i = 0; i < nums.length; i++) {
            nums[i] = (double)i;
        }
        System.out.println("A portion of the original sequence:");
        for (int i = 0; i < nums.length; i++) {
            System.out.print(nums[i] + "  ");
        }
        System.out.println("\n");
        long start = System.currentTimeMillis();
        int n = nums.length;
        for (int i = 0; i < n; i++) {
            nums[i] = Math.sqrt(nums[i]);
        }
        for (int i = 0; i < nums.length; i++) {
            System.out.format("%.4f ",nums[i]);
        }
        System.out.println();
        System.out.println(System.currentTimeMillis() - start);
==============================================
==================fork/join======================
ForkJoinPool fjp = new ForkJoinPool();
        double[] nums = new double[10000000];

        for (int i = 0; i < nums.length; i++) {
            nums[i] = (double)i;
        }
        System.out.println("A portion of the original sequence:");
        for (int i = 0; i < nums.length; i++) {
            System.out.print(nums[i] + "  ");
        }
        System.out.println("\n");
        long start = System.currentTimeMillis();
        SqrtTransform task = new SqrtTransform(nums,0,nums.length);
        //start the main ForkJoinTask
        fjp.invoke(task);
        System.out.println("A portion of the transformed sequence " +
                "(to four decimal places):");
        for (int i = 0; i < nums.length; i++) {
            System.out.format("%.4f ",nums[i]);
        }
        System.out.println();
        System.out.println(System.currentTimeMillis() - start);
================================================
================SqrtTransform=====================
class SqrtTransform extends RecursiveAction{
    final int seqThreshold = 10000;
    double[] data;
    int start,end;
    SqrtTransform(double[] vals,int s,int e){
        data = vals;
        start = s;
        end = e;
    }

    @Override
    protected void compute() {
        if((end - start) < seqThreshold ){
            for (int i = start; i < end; i++) {
                data[i] = Math.sqrt(data[i]);
            }
        }else{
            int middle = (start + end ) / 2;
            invokeAll(new SqrtTransform(data,start,middle),new SqrtTransform(data,middle,end));
        }
    }
}
   发表时间:2015-05-28  
补充:计算10000000个数的平方根
两种方式运行时间相差无几,不是应该fork/join运行快吗?
0 请登录后投票
   发表时间:2015-05-28  
初步认定是由于System.out.println()造成,去掉之后,差别在2-3倍
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics