我正在为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;
}
}
答案 0 :(得分:2)
与顺序版相比,您没有看到任何加速,因为大部分时间都花在分割和加入任务上。在快捷方式中 - 您在测试中遇到的问题太简单了。有关详细信息,请查看Angelika Langer's Geecon presentation。