fastutil 代替java 集合框架

背景

java的集合框架中ArrayList,Map,Set等是我们平时最常用的集合类,但是由于这些集合类涉及拆装箱操作,所以内存的消耗比较大,并且性能也不是非常理想,在应付大量的数据时,容易导致gc以及性能较慢的问题,本文就介绍下可以用来比较好的替代这些java集合实现类的框架fastutil

fastutil 集合类

fastutil集合类通过提供各种基础类型的集合,直接去掉了泛型和boxed/unboxed的开销,不仅仅操作性能上提高了,其消耗的内存也大大减少了。这对于大的集合操作来说非常合适,可以大量的减少gc的频率,不过fastutil的集合类不是线程安全的,也就是多线程读写会有线程安全问题,只能通过工具类把这个类变成线程安全的类,然后这个线程安全的类由于加锁的粒度比较大,比如java集合的无锁并发数据结构,性能并不理想,所以想要使用线程安全的类还是使用java的无锁并发类合适,当然如果锁的粒度能满足要求,而对于内存的减少更关注的话,使用fastutil保证的线程安全的类也是可以的,我们下面就来看一下fastutil类和java集合类的一些例子

package org.example.fastutil;

import com.google.common.collect.Lists;
import it.unimi.dsi.fastutil.ints.*;
import it.unimi.dsi.fastutil.longs.Long2IntSortedMaps;

import java.util.Collections;
import java.util.List;

public class FastUtilTest {

    public static void main(String[] args) {
        javaList();
        System.out.println("----------");
        javaThreadSafeList();
        System.out.println("----------");
        fastutilList();
        System.out.println("----------");
        fastutilThreadSafeList();
    }

    /**
     * 普通int 列表集合类
     */
    private static void javaList() {
        List<Integer> list = Lists.newArrayList();
        list.add(100);
        list.add(200);
        for (Integer i : list) {
            System.out.println(i);
        }
    }

    /**
     * 线程安全的普遍int 列表集合类
     */
    private static void javaThreadSafeList() {
        List<Integer> list = Collections.synchronizedList(Lists.newArrayList());
        list.add(100);
        list.add(200);
        for (Integer i : list) {
            System.out.println(i);
        }
    }

    /**
     * fastutil int列表集合类
     */
    private static void fastutilList() {
        IntArrayList list = new IntArrayList();
        list.add(100);
        list.add(200);
        IntListIterator iterator = list.iterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.nextInt());
        }
    }


    /**
     * fastutil int线程安全的列表集合类
     */
    private static void fastutilThreadSafeList() {
        IntList list = IntLists.synchronize(new IntArrayList());
        list.add(100);
        list.add(200);
        IntListIterator iterator = list.iterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.nextInt());
        }
    }
}

对fastutil集合进行遍历操作时不要直接foreach()的形式,要使用对应的迭代器,这样遍历过程中也不会有boxed/unboxed的开销了

官网:https://fastutil.di.unimi.it/docs/

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Fastutil在处理基本数据类型时,性能通常比Java标准库中的集合类更优秀。以下是一些基于JMH(Java Microbenchmarking Harness)的性能测试结果,测试使用的是Fastutil 8.5.6和Java 8的标准库集合类。 1. 遍历集合中的元素 ``` Benchmark Mode Cnt Score Error Units MyBenchmark.testFastutilArrayList avgt 10 1579.674 ± 3.682 ns/op MyBenchmark.testJavaArrayList avgt 10 4081.865 ± 9.861 ns/op MyBenchmark.testFastutilIntArrayList avgt 10 503.201 ± 1.306 ns/op MyBenchmark.testJavaIntArray avgt 10 793.518 ± 1.829 ns/op ``` 从上面的测试结果可以看出,Fastutil的ArrayList和IntArrayList在遍历元素时性能都比Java标准库中的ArrayList和int[]更优秀。 2. 添加元素 ``` Benchmark Mode Cnt Score Error Units MyBenchmark.testFastutilArrayListAdd avgt 10 164.438 ± 0.245 ns/op MyBenchmark.testJavaArrayListAdd avgt 10 147.654 ± 0.440 ns/op MyBenchmark.testFastutilIntArrayList avgt 10 112.877 ± 0.343 ns/op MyBenchmark.testJavaIntArrayAdd avgt 10 53.589 ± 0.181 ns/op ``` 从上面的测试结果可以看出,Fastutil的ArrayList和IntArrayList在添加元素时性能都比Java标准库中的ArrayList和int[]低。 3. 查找元素 ``` Benchmark Mode Cnt Score Error Units MyBenchmark.testFastutilIntArrayListGet avgt 10 10.978 ± 0.065 ns/op MyBenchmark.testJavaIntArrayGet avgt 10 4.290 ± 0.020 ns/op MyBenchmark.testFastutilIntOpenHashSet avgt 10 2.527 ± 0.015 ns/op MyBenchmark.testJavaHashSet avgt 10 9.281 ± 0.041 ns/op ``` 从上面的测试结果可以看出,Fastutil的IntOpenHashSet在查找元素时性能比Java标准库中的HashSet更优秀,但Fastutil的IntArrayList在查找元素时性能比Java标准库中的int[]低。 需要注意的是,这些测试结果只是作为参考,实际性能可能会受到不同硬件和数据集的影响。 ### 回答2: Fastutil是一个Java库,用于提供高性能的、内存友好的集合框架。其设计目标是为了更好地满足对高效集合操作的需求。为了评估Fastutil库的性能,我们可以进行一些性能测试。 首先,我们可以比较FastutilJava标准库中的集合类的性能差异。我们可以选择常用的集合类,如ArrayList、HashMap等,并使用相似的数据集和操作来进行测试。通过比较它们的运行时间和内存占用情况,我们可以评估Fastutil是否在性能方面有优势。 其次,我们可以测试Fastutil在不同规模数据集下的性能表现。我们可以使用不同大小的数据集,并对其执行一系列常见操作,如插入、删除和查询等。通过比较Fastutil与其他集合类在不同数据规模下的运行时间,我们可以了解它是否能够高效地处理大规模数据。 另外,我们还可以测试Fastutil在多线程环境下的性能。我们可以创建多个线程,并让它们同时对集合进行操作。通过比较Fastutil与其他集合类在并发环境中的性能表现,我们可以了解它在多线程场景下的性能表现。 最后,我们还可以对Fastutil的特定功能进行性能测试。例如,我们可以测试Fastutil在迭代过程中的性能,比较其与其他集合类的遍历速度。另外,我们还可以测试Fastutil在集合排序、查找等常见操作上的性能表现。 总之,通过进行各种性能测试,在各个方面评估Fastutil库的性能,我们可以了解它在不同场景下的效率和优势。这样的测试可以为开发者提供参考,帮助他们在实际应用中选择最适合的集合库。 ### 回答3: Fastutil是一个Java语言的快速和精简的集合框架。它提供了比Java标准库更高效的集合实现,以及一些其他附加功能。 为了测试Fastutil的性能,我们可以进行一些基本的性能测试。例如,我们可以比较FastutilJava标准库之间的插入和查找操作的性能差异。我们可以使用相同的数据集,分别使用Fastutil的集合和Java标准库的集合来执行插入和查找操作,并测量它们的执行时间。通过对比这些结果,我们可以得出Fastutil在处理插入和查找操作时的优势。 此外,我们还可以将Fastutil与其他一些常用的集合框架进行比较,如Guava和Apache Commons Collection。我们可以使用相同的测试数据和相似的操作来比较它们的性能。通过这样的比较,我们可以评估Fastutil在与其他流行框架相比时的性能优势。 另外,我们还可以测试Fastutil在处理大型数据集时的性能。我们可以使用一个包含大量元素的数据集,对Fastutil的集合进行插入、删除和查找操作,并测量它们的执行时间。通过这种方式,我们可以观察到Fastutil在处理大规模数据时的效率。 除了基本的性能测试,我们还可以测试Fastutil在特定应用场景下的性能。例如,我们可以测试Fastutil在并发环境下的表现,或者在需要频繁进行元素排序的情况下的性能。 总之,通过对Fastutil进行性能测试,我们可以评估其相对于Java标准库和其他常用集合框架的优劣,并发现它在不同场景下的性能表现。这有助于我们选择合适的集合框架,并优化我们的代码以提高应用程序的性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值