【问题标题】:Java for loop improve performanceJava for 循环提高性能
【发布时间】:2016-01-22 12:35:16
【问题描述】:

我有一个像这样的for loop 结构:

for(T element1 : list1) {
  for(T element2 : element1.getSubElements()) {
    ...
  }
}

list1 包含大约 10.000 个元素,element1.getSubElements() 还包含大约 10-20 个元素,每次迭代。

循环大约需要 2 分钟才能完成。

关于如何改进这一点的任何想法?

【问题讨论】:

  • 分析... 中的内容,看看那里是否有任何事情要做。
  • 你不会在集合解析中获得太多的速度,你需要看看内部括号之间的逻辑。
  • 你在用element1element2做什么?
  • if 条件下是有意义的。添加一些诸如System.out.println(System.currentTimeMillis()) 之类的计时报告,以准确确定哪个方法调用花费的时间最多。
  • 我猜,你也需要显示内部 for 循环的逻辑。除了循环需要时间之外,可能还有其他事情。此外,可能会根据您的情况对列表进行某些排序以提高性能。您还需要显示list1element1.getSubElements() 的实际对象类型。

标签: java performance for-loop


【解决方案1】:

循环不会花费那么长时间。您在循环中所做的工作需要时间。

您的选择是;

  • 使用分析器优化循环内的工作。
  • 使用parallelStream() 来查看跨多个线程执行工作是否会缩短所需时间。

我有一个 if,如果条件为真,我将 element2 添加到 ArrayList。也许问题出在 if 中?

要使用parallelStream,你可以这样做

List<T> list2 = list1.parallelStream()
                     .flatMap(e -> e.getSubElements().stream())
                     .filter(e -> e.isConditionTrue())
                     .collect(Collectors.toList());

【讨论】:

    【解决方案2】:

    试试Lambda expression

    list1.forEach(new T<E>() {
        public void accept(E value) {
            System.out.println(value);
        }
    });
    

    实际上,Java 8 中已经添加了 forEach 方法和 Consumer 接口,但是您已经可以使用 guava 或 lambdaj 等库在 Java 5+ 中执行非常类似的操作。然而,Java 8 lambda 表达式允许以一种更简洁、更易读的方式实现相同的结果:

    list1.forEach((E value) -> System.out.println(value));
    

    【讨论】:

    • 注意:虽然您可以这样写,但这样做不太可能更快,而且很有可能会稍微慢一些。
    • 什么平分?迭代集合很便宜。在 OP 的情况下,... 很昂贵。
    猜你喜欢
    • 2018-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-25
    相关资源
    最近更新 更多