Java 8 stream API会导致性能下降?
【摘要】 今日考试,其中一道题先用非流式编程写完,稍后为简洁,使用了STREAM流式重构了其中两个地方。在提交代码时,发现阅卷系统反馈STREAM风格的代码比非STREAM的慢了4倍。(阅卷系统反馈非流式的30多毫秒, 流式的120多毫秒)代码如下:public int leastBricks2(List<List<Integer>> wall) { Map<Integer, Integer> ...
今日考试,其中一道题先用非流式编程写完,稍后为简洁,使用了STREAM流式重构了其中两个地方。在提交代码时,发现阅卷系统反馈STREAM风格的代码比非STREAM的慢了4倍。(阅卷系统反馈非流式的30多毫秒, 流式的120多毫秒)
代码如下:
public int leastBricks2(List<List<Integer>> wall) {
Map<Integer, Integer> sumValues = new HashMap<>();
int count = 0;
for (List<Integer> awall : wall) {
int sum = 0;
int length = awall.size();
for (int iLoop = 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<Integer, Integer> entry : sumValues.entrySet()) {
count = entry.getValue() > count ? entry.getValue() : count;
}
return wall.size() - count;
}
public int leastBricks1(List<List<Integer>> wall) {
Map<Integer, Integer> sumValues = new HashMap<>();
for (List<Integer> aWall : wall) {
int sum = 0;
int length = aWall.size();
for (int iLoop = 0; iLoop < length - 1; iLoop++) {
sum += aWall.get(iLoop);
sumValues.compute(sum, (key, value) -> value == null ? 1 : value + 1);
}
}
int count = sumValues.entrySet().stream().mapToInt(Map.Entry::getValue).max().orElse(0);
return wall.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毫秒。 猜想这个加载耗时可能是类初始化。)
3 这五种姿势总结的挺好。https://binac.io/2018/06/02/use-map-to-count-in-java/
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)