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