Java 8并行流减少 - 线程数与加速

时间:2015-08-10 05:56:28

标签: java multithreading parallel-processing java-8 reduction

我正在为java 8并行流的缩减操作运行一个关于不同线程数的实验:总计超过1150万个数字。我在8核心intel xeon处理器上运行它。当我将线程数从16变为1时,我没有看到总执行时间和总CPU时间有太大差异。我确实加速比顺序版本使用'流'而不是“并行流”#。我想了解线程数之间的相关性和连续减少之间的加速度。

有人可以帮我解释这个问题吗?我的代码在某处错了吗?

源代码为here,第74行执行并行缩减。

代码的相关部分也粘贴在下面:

class RedOperator implements BinaryOperator<MonResult>{

    @Override
    public MonResult apply(MonResult t, MonResult u) {
        // TODO Auto-generated method stub
        if(t != null && u != null)
            t.count = t.count + u.count;
        return t;
    }

}

class FOFinisher implements Function<ConcurrentHashMap<ArrayList<String>, ArrayList<MonResult>>, ArrayList<MonResult>>{


    protected MonResult id;
    protected boolean isParallel;
    public FOFinisher(boolean isparallel){
        id = new MonResult();
        id.count = 0;
        this.isParallel = isparallel;
    }
    public long getJVMCpuTime() {
        long lastProcessCpuTime = 0;
        try {
            if (ManagementFactory.getOperatingSystemMXBean() instanceof OperatingSystemMXBean) {
                lastProcessCpuTime=((com.sun.management.OperatingSystemMXBean)ManagementFactory.getOperatingSystemMXBean()).getProcessCpuTime();
            }
        }
        catch (  ClassCastException e) {
            System.out.println(e.getMessage());
        }finally{
            return lastProcessCpuTime;
        }
    }
    @Override
    public ArrayList<MonResult> apply(ConcurrentHashMap<ArrayList<String>, ArrayList<MonResult>> t) {
        // TODO Auto-generated method stub

        long beg = System.nanoTime();
        long begCPU = getJVMCpuTime();
        ArrayList<MonResult> ret;
        RedOperator x = new RedOperator();
        if(isParallel){
            ret = new ArrayList<MonResult>(t.values().stream().map((alist)->{
                        return alist.parallelStream().reduce(id,x);
                    }).collect(Collectors.toList()));
        }
        else{
            ret = new ArrayList<MonResult>(t.values().stream().map((alist)->{
                        return alist.stream().reduce(id,x);
                    }).collect(Collectors.toList()));
        }

        long end = System.nanoTime();
        long endCPU = getJVMCpuTime();
        System.out.println("Exec Time:" + TimeUnit.MILLISECONDS.convert((end-beg),TimeUnit.NANOSECONDS));
        System.out.println("CPU Time : " + TimeUnit.MILLISECONDS.convert((endCPU-begCPU),TimeUnit.NANOSECONDS));
        return ret;
    }

}

1 个答案:

答案 0 :(得分:2)

与顺序版相比,您没有看到任何加速,因为大部分时间都花在分割和加入任务上。在快捷方式中 - 您在测试中遇到的问题太简单了。有关详细信息,请查看Angelika Langer's Geecon presentation