今日考试,其中一道题先用非流式编程写完,稍后为简洁,使用了STREAM流式重构了其中两个地方。在提交代码时,发现阅卷系统反馈STREAM风格的代码比非STREAM的慢了4倍。(阅卷系统反馈非流式的30多毫秒, 流式的120多毫秒)
代码如下:
public intleastBricks2(List> wall) {
Map sumValues =newHashMap<>();intcount =0;for(List awall : wall) {intsum =0;intlength = awall.size();for(intiLoop =0; iLoop < length -1; iLoop++) {
sum += awall.get(iLoop);if(sumValues.get(sum) == null) {
sumValues.put(sum, 1);
} else{
sumValues.put(sum, sumValues.get(sum) + 1);
}}
}for(Map.Entry entry : sumValues.entrySet()) {
count = entry.getValue() > count ? entry.getValue() : count;
}returnwall.size() - count;
}public intleastBricks1(List> wall) {
Map sumValues =newHashMap<>();for(List aWall : wall) {intsum =0;intlength = aWall.size();for(intiLoop =0; iLoop < length -1; iLoop++) {
sum += aWall.get(iLoop);sumValues.compute(sum, (key, value) -> value == null? 1 : value + 1);}
}intcount = sumValues.entrySet().stream().mapToInt(Map.Entry::getValue).max().orElse(0);returnwall.size() - count;
}
使用以下数组测试:
1,2,2,1
3,1,2
1,3,2
2,4
3,1,2
1,3,1,1
测试发现:
1 非流式运行时长0毫秒。 流式运行50毫秒。
2 把compute或max这两处修改的一处屏蔽掉,运行时长依然是50毫秒。
3 把compute或max这两处修改完全屏蔽掉,运行时长0毫秒。
说明:
1 在最原始、简单的数据处理下,流式确实会慢一些。
2 具体慢的点可能是某些东西的初始化导致的。(因为屏蔽掉一处运行时长不变, 后在流式处理的前后打时间戳,证明猜想正确。又wall对象和一个完全新建的MAP对象使用相等stream操作,耗时0毫秒。 猜想这个加载耗时可能是类初始化。)