java - 为什么函数式处理大量数据时比命令式要快,而处理少量数据时比命令式要慢?
问题描述
我想将循环的性能与流进行比较。为此,我写了 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(","));
}
解决方案
命令式和函数式之间不应该有任何性能差异。函数式编程将通过使用预定义的函数来提高代码的可读性。在内部,他们必须进行类似类型的处理。函数式风格的主要优点之一是您可以一眼看懂代码。并行流可以比您的命令式代码更快,但如果您确定数据量很大并且可以从并行处理中受益,则可以使用并行流。否则并行流会比普通流慢。来到您的示例代码,我觉得通过使用 Collectors.joining 您可以获得比 if-else 检查的性能优势,因为您正在使用字符串追加操作,该操作将在每次追加时继续创建一个新的字符串对象。而是收藏家。
推荐阅读
- android - 是否可以设置按钮宽度以匹配 kotlin 中的父级?
- python - 为什么迁移文件经常被排除在代码格式化之外?
- lodash - 如何根据子键的值返回父级?
- mysql - 左连接与子查询的性能问题以找出最新日期
- html - 将表格中的最后一个标题设置为自动调整行中按钮的大小
- python - 复数中的 Mandelbrot 集绘图和 ZeroDivisionError
- android - ReactNative & Expo - 错误:“值”是只读的
- angular - Ngx-Chart 不显示数据
- excel - 如何比较多个命名列范围中相应单元格的值并更改另一个相应单元格中的内部颜色
- python - PyLint W0231 super-init-not-call with __init__ of祖父母