首页 > 解决方案 > 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);
    }

标签: javajava-8

解决方案


我在下面的代码中有一个嵌套循环,我正在尝试优化它,因为我知道嵌套 for 循环非常昂贵,有人有不同的方法来实现这一点吗?

循环嵌套是否昂贵取决于每个循环执行了多少次迭代,以及每次迭代中完成了哪些工作——尤其是对于最内层的循环。一般来说,将消除嵌套循环作为提高性能的一种机制来关注是没有用的,因为简单地以不同方式分配工作的重组通常不会产生重大影响。只有通过重组,您可以安排消除不必要的工作或增加并发性,这样的重组才有意义。

目前尚不清楚这些替代方案中的任何一个是否适用于您的情况,但提高并发性的最佳选择是并行处理列表元素。如果列表可能包含重复元素以及其他可能性,这是不安全的,但如果它是合理的,那么你可以这样写:

list.parallelStream()
    .forEach(map -> {
        setFilePathAndOffsetParams(map);
        for (Map.Entry<String, String> entry : anotherMap.entrySet()) {
            updateKeyOnMap(map, entry.getKey(), entry.getValue());
        }
    });

但是请注意,虽然并行化可能会改善运行时间,但它会增加一些开销,而不会减少总工作量。因此,它不会提高总 CPU 时间。


推荐阅读