Java 8 stream API会导致性能下降?

举报
eagle 发表于 2019/12/20 19:53:26 2019/12/20
【摘要】 今日考试,其中一道题先用非流式编程写完,稍后为简洁,使用了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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。