当前位置: 首页 > 知识库问答 >
问题:

Java Arraylist映射速度比较

鲁鸿
2023-03-14

我正在尝试将ArrayList转换为Treemap,所以我编写了一个比较各种方法的基准:

1)并行流中的toMap

2)toMap在流中

3)流中forEach

public class Set {
private String foo;
private int bar;

public Set(String foo, int bar) {
    this.foo = foo;
    this.bar = bar;
}

public String getFoo() {
    return foo;
}

public void setFoo(String foo) {
    this.foo = foo;
}

public int getBar() {
    return bar;
}

public void setBar(int bar) {
    this.bar = bar;
}

}

public class Test {
TreeMap tr=new TreeMap();

public static void main(String[] args) {
    Test t = new Test();
    t.g();
}

public void g(){
    ArrayList<Set> ar=new ArrayList<>();
    for (int i = 0; i < 1_000_000; i++) {
        ar.add(new Set(UUID.randomUUID().toString(), new Random().nextInt()));
    }
    long start;
    long end;
    System.out.println("Parallel toMap");
    start=System.nanoTime();
    tr.putAll(ar.parallelStream().collect(Collectors.toMap(Set::getFoo, Set::getBar)));
    end=System.nanoTime();
    System.out.println(end-start);

    tr=new TreeMap();
    System.out.println("non-Parallel toMap");
    start=System.nanoTime();
    tr.putAll(ar.stream().collect(Collectors.toMap(Set::getFoo, Set::getBar)));
    end=System.nanoTime();
    System.out.println(end-start);

    tr=new TreeMap();
    System.out.println("non-Parallel forEach");
    start=System.nanoTime();
    ar.stream().forEach(product -> {
            tr.put(product.getFoo(), product.getBar());
        });
    end=System.nanoTime();
    System.out.println(end-start);

    tr=new TreeMap();
    System.out.println("Parallel forEach");
    start=System.nanoTime();
//HANGS SOMEWHERE HERE
    ar.parallelStream().forEach(product -> {
        try {
            tr.put(product.getFoo(), product.getBar());
        } catch (Exception e) {
            System.out.println(e.getLocalizedMessage());
        }

        });
    end=System.nanoTime();
    System.out.println(end-start);

    tr=new TreeMap();
    System.out.println("non-Parallel loop");
    start=System.nanoTime();
    for(Set product:ar)
        tr.put(product.getFoo(), product.getBar());

    end=System.nanoTime();
    System.out.println(end-start);
    }
}

大小为10_000的输出如下

Parallel toMap
130793206
non-Parallel toMap
21729202
non-Parallel forEach
7601349
Parallel forEach
3233395
non-Parallel loop
9744039

“for loop”与预期一样是最慢的

回到正题,为什么当arraylist列表很大时,for each in parallel steam会失败?

运行i7 2670QM,因此线程池大小应为8

共有1个答案

郜昊苍
2023-03-14

treemap不是线程安全的。因此,当从多个线程中使用它时,所有的赌注都关闭了。您可以在hashmap中获得无限循环。大概treemap在某些方面表现得相当糟糕。

(关于基准测试:由于JVM的“热身”方式,您应该为每个测试启动一个新的进程。同时在一个进程中连续运行测试多次。)

 类似资料:
  • 比赛速度功能有助于您保持稳定配速,并在设定距离内达到您的目标时间。定义某段距离的目标时间 - 例如将 10 公里跑步的目标时间设定为 45 分钟,并跟踪对比实际用时与这个预设目标的差距。 您可以在手表上设置比赛速度,或者可以在 Flow 网络服务或应用程序中设置比赛速度目标,并同步至手表。 如果您已计划好当天的比赛速度目标,手表会在进入训练准备模式时建议您启动该目标。 在手表上创建比赛速度目标 您

  • 比赛速度功能有助于您保持稳定配速,并在设定距离内达到您的目标时间。定义某段距离的目标时间 - 例如将 10 公里跑步的目标时间设定为 45 分钟,并跟踪对比实际用时与这个预设目标的差距。 您可以在手表上设置比赛速度,或者可以在 Flow 网络服务或应用中设置比赛速度目标,并同步至手表。 如果您已计划好当天的比赛速度目标,手表会在进入训练准备模式时建议您启动该目标。 在手表上创建比赛速度目标 您可以

  • 问题内容: 它们看起来几乎一样,甚至是语法? 使用什么?或什么时候使用什么? 问题答案: 速度不再是真正活跃的开发。Freemarker是。 根据我的经验,Freemarker也更加灵活。

  • 我们的应用程序将大量数据存储在内存中,存储在多种不同类型的地图中,以便快速查找。为了保持简单(不考虑原始贴图),它始终是一个带有一个或多个键的贴图。性能对我们来说是一个很大的要求。 我想找到性能最好的地图实现,正如这里建议的那样,我比较了这些实现: > java中的包装键(元组作为键)。util。哈希图 元组作为网络中的键。openhft。科洛博克。收集地图搞砸HashObjObjMap,根据这一

  • 本文向大家介绍UnityShader使用速度映射图实现运动模糊,包括了UnityShader使用速度映射图实现运动模糊的使用技巧和注意事项,需要的朋友参考一下  本文实例为大家分享了UnityShader实现运动模糊的具体代码,供大家参考,具体内容如下 原理: 像素的当前帧的NDC坐标(x,y值由uv映射而来,z值由深度值映射而来)——(使用_CurrentViewProjectionInvers

  • 问题内容: 我试图通过将结果对象与原始对象进行比较来验证例程的序列化和反序列化。这些例程可以序列化任意的和深层嵌套的类,因此,我需要一个比较例程,该例程可以提供原始实例和最终实例,并反射性地遍历每种值类型并比较这些值,然后迭代地浸入引用类型以比较值。 我已经尝试过Apache Commons Lang,但这似乎并没有进行很深入的比较,它只是比较引用类型是否相等,而没有深入研究它们: 以下代码说明了