首页 > 解决方案 > 为什么函数式处理大量数据时比命令式要快,而处理少量数据时比命令式要慢?

问题描述

我想将循环的性能与流进行比较。为此,我写了 2 个方法。两者都过滤掉以“A”开头的名称并以字符串形式返回它们。如果我使用 50.000 个随机生成的名称来执行此操作,那么命令式方法会更快。但是,如果我使用 500.000 个随机生成的名称来执行此操作,则功能方式会更快。

我的问题是为什么函数范式对于小数据集来说更慢而对大数据集来说更快?流是否需要大量时间来初始化,但在此之后它们更有效?

public String imperativeArray() {

String result = "";
  for(String name : arraytestSet) {
    if(name.startsWith("A")) {
       if(result.isEmpty()) {
          result += name;
       } else {
          result += "," + name;
       }
    }
  }
   return result;
}

public String functionalArray() {
   return Arrays.stream(arraytestSet)
     .filter(e -> e.startsWith("A"))
     .collect(Collectors.joining(","));
}

标签: javaperformancearraylistfunctional-programmingjava-stream

解决方案


命令式和函数式之间不应该有任何性能差异。函数式编程将通过使用预定义的函数来提高代码的可读性。在内部,他们必须进行类似类型的处理。函数式风格的主要优点之一是您可以一眼看懂代码。并行流可以比您的命令式代码更快,但如果您确定数据量很大并且可以从并行处理中受益,则可以使用并行流。否则并行流会比普通流慢。来到您的示例代码,我觉得通过使用 Collectors.joining 您可以获得比 if-else 检查的性能优势,因为您正在使用字符串追加操作,该操作将在每次追加时继续创建一个新的字符串对象。而是收藏家。


推荐阅读