java - Java...嵌套循环优化
问题描述
我在下面的代码中有一个嵌套循环,我正在尝试优化它,因为我知道嵌套 for 循环非常昂贵,有人有不同的方法来实现这一点吗?
提前致谢!
private List<Map<String, Object>> updateSomething(List<Map<String, Object>> list)
throws MetadataException {
for (Map<String, Object> map : list) {
setFilePathAndOffsetParams(map);
for (Map.Entry<String, String> entry : anotherMap.entrySet()) {
updateKeyOnMap(map, entry.getKey(), entry.getValue());
}
}
return list;
}
private void updateKeyOnMap(Map<String, Object> map, String newKey, String oldKey) {
if (!newKey.equals(oldKey)) {
map.put(newKey, map.get(oldKey));
map.remove(oldKey);
}
解决方案
我在下面的代码中有一个嵌套循环,我正在尝试优化它,因为我知道嵌套 for 循环非常昂贵,有人有不同的方法来实现这一点吗?
循环嵌套是否昂贵取决于每个循环执行了多少次迭代,以及每次迭代中完成了哪些工作——尤其是对于最内层的循环。一般来说,将消除嵌套循环作为提高性能的一种机制来关注是没有用的,因为简单地以不同方式分配工作的重组通常不会产生重大影响。只有通过重组,您可以安排消除不必要的工作或增加并发性,这样的重组才有意义。
目前尚不清楚这些替代方案中的任何一个是否适用于您的情况,但提高并发性的最佳选择是并行处理列表元素。如果列表可能包含重复元素以及其他可能性,这是不安全的,但如果它是合理的,那么你可以这样写:
list.parallelStream()
.forEach(map -> {
setFilePathAndOffsetParams(map);
for (Map.Entry<String, String> entry : anotherMap.entrySet()) {
updateKeyOnMap(map, entry.getKey(), entry.getValue());
}
});
但是请注意,虽然并行化可能会改善运行时间,但它会增加一些开销,而不会减少总工作量。因此,它不会提高总 CPU 时间。
推荐阅读
- javascript - 如何使用 JavaScript 获取 AJAX 的选择值
- facebook - Facebook 消息 Webhook 事件:如何识别消息是页面故事的回复/评论?
- java - 如何在jsonobject中存储图像
- flutter - SharedPreferences.getInstance() 总是返回 null
- android - Android按钮文本对齐不起作用
- r - 如何从一组 N 个对象中选择 n 个对象,最大化它们之间的成对距离之和
- postgresql - 如何安装和启动 PostgreSQL 作为独立的基于 Python 的应用程序的一部分?
- python - Pandas:如何找到列的分箱均值
- bash - 从文件中获取特定字符串
- docker - 如何在 kubectl set 映像上指定注册表凭据?