【问题标题】:Java...Nested for loop optimizationJava...嵌套循环优化
【发布时间】:2018-07-03 15:23:08
【问题描述】:

我在下面的代码中有一个嵌套循环,我正在尝试优化它,因为我知道嵌套 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);
    }

【问题讨论】:

  • 使用索引数组。看到这个链接->stackoverflow.com/questions/18028344/…
  • 您确定需要对此进行优化吗?还有这个代码到底应该做什么?也许您可以从第二次小睡中删除一些已经检查过的元素。但是这些地图有多大?
  • 另一个地图从何而来?
  • 为什么你认为嵌套for循环非常昂贵?您在循环中拥有的代码可能很昂贵,但循环几乎没有成本。
  • 你可能应该质疑你认为应该知道的事情。

标签: java java-8


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2021-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-27
    • 2015-05-29
    • 2020-05-18
    • 1970-01-01
    相关资源
    最近更新 更多