为什么对于大量数据,功能要比命令要快,而对于少量数据,功能要比命令要慢?

时间:2019-04-12 17:35:59

标签: java performance arraylist functional-programming java-stream

我想比较循环和流的性能。为此,我编写了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(","));
}

1 个答案:

答案 0 :(得分:0)

命令性和功能性之间不应有任何性能差异。函数式编程将通过使用预定义的函数来提高代码的可读性。在内部,他们必须执行类似类型的处理。函数样式的主要优点之一是,您可以一眼就能理解代码。 并行流可以比命令性代码快,但是如果您确定数据将是巨大的并可以从并行处理中受益,则可以使用并行流。否则并行流将比正常流慢。 来到您的示例代码,我觉得通过使用Collectors.join会比if-else检查获得性能上的好处,因为您正在使用字符串附加操作,该操作将在每次附加时继续创建新的字符串对象。但是collectors.joining在内部使用StringBuilder,因此每次附加时都可在单个对象上工作。