Guide til FastUtil

1. Introduksjon

I denne opplæringen ser vi på FastUtil bibliotek.

Først koder vi noen eksempler på dens typespesifikke samlinger.

Deretter analyserer vi ytelse som gir FastUtil dets navn.

Til slutt, la oss ta en titt på FastUtil‘S BigArray verktøy.

2. Funksjoner

De FastUtil Java-biblioteket søker å utvide Java Collections Framework. Det gir typespesifikke kart, sett, lister og køer med mindre minnefotavtrykk og rask tilgang og innsetting. FastUtil gir også et sett med verktøy for å jobbe med og manipulere store (64-bit) matriser, sett og lister.

Biblioteket inkluderer også en mange praktiske inngangs- / utgangsklasser for binære filer og tekstfiler.

Den siste utgivelsen, FastUtil 8, ga også ut en rekke typespesifikke funksjoner, og utvidet JDK-ene Funksjonelle grensesnitt.

2.1. Hastighet

I mange tilfeller har FastUtil implementeringer er de raskeste tilgjengelige. Forfatterne har til og med gitt sin egen grundige referanserapport og sammenlignet den med lignende biblioteker HPPC og Trove.

I denne opplæringen vil vi se på å definere våre egne referanser ved hjelp av Java Microbench Harness (JMH).

3. Fullstort avhengighet

På toppen av det vanlige JUnit avhengighet, bruker vi FastUtils og JMH avhengigheter i denne opplæringen.

Vi trenger følgende avhengigheter i vår pom.xml fil:

 it.unimi.dsi fastutil 8.2.2 org.openjdk.jmh jmh-core 1.19 test org.openjdk.jmh jmh-generator-annprocess 1.19 test 

Eller for Gradle-brukere:

testCompile gruppe: 'org.openjdk.jmh', navn: 'jmh-core', versjon: '1.19' testCompile gruppe: 'org.openjdk.jmh', navn: 'jmh-generator-annprocess', versjon: '1.19' kompilere gruppe: 'it.unimi.dsi', navn: 'fastutil', versjon: '8.2.2'

3.1. Tilpasset krukkefil

På grunn av mangel på generiske legemidler, FastUtils genererer et stort antall typespesifikke klasser. Og dessverre fører dette til en stor krukkefil.

Heldigvis for oss, FastUtils inkluderer en finn-deps.sh skript som tillater generering av mindre, mer fokuserte krukker består av bare klassene vi ønsker å bruke i applikasjonen vår.

4. Typespesifikke samlinger

Før vi begynner, la oss ta en rask titt på den enkle prosessen med å sette i gang en typespesifikk samling. La oss velge en HashMap som lagrer nøkler og verdier ved hjelp av dobler.

For dette formålet, FastUtils gir en Double2DoubleMap grensesnitt og en Double2DoubleOpenHashMap gjennomføring:

Double2DoubleMap d2dMap = ny Double2DoubleOpenHashMap ();

Nå som vi har instansert klassen vår, kan vi ganske enkelt fylle ut data som vi ville gjort med hvilken som helst Kart fra Java Collections API:

d2dMap.put (2.0, 5.5); d2dMap.put (3.0, 6.6);

Til slutt kan vi sjekke at dataene er lagt til riktig:

assertEquals (5.5, d2dMap.get (2.0));

4.1. Opptreden

FastUtils fokuserer på sine performante implementeringer. I denne delen bruker vi JMH for å verifisere det faktum. La oss sammenligne Java-samlingene HashSet implementering mot FastUtil's IntOpenHashSet.

La oss først se hvordan du implementerer IntOpenHashSet:

@Param ({"100", "1000", "10000", "100000"}) offentlig int setSize; @Benchmark public IntSet givenFastUtilsIntSetWithInitialSizeSet_whenPopulated_checkTimeTaken () {IntSet intSet = new IntOpenHashSet (setSize); for (int i = 0; i <setSize; i ++) {intSet.add (i); } returner intSet; }

Ovenfor har vi ganske enkelt erklært IntOpenHashSet gjennomføring av IntSet grensesnitt. Vi har også erklært den opprinnelige størrelsen setSize med @Param kommentar.

Enkelt sagt, disse tallene mates inn i JMH for å produsere en serie referansetester med forskjellige settstørrelser.

Neste, la oss gjøre det samme ved bruk av Java Collections-implementeringen:

@Benchmark public Set givenCollectionsHashSetWithInitialSizeSet_whenPopulated_checkTimeTaken () {Set intSet = new HashSet (setSize); for (int i = 0; i <setSize; i ++) {intSet.add (i); } returner intSet; }

Til slutt, la oss kjøre referanseindeksen og sammenligne de to implementeringene:

Benchmark (setSize) Mode Cnt Score Units givenCollectionsHashSetWithInitialSizeSet ​​... 100 avgt 2 1.460 us / op givenCollectionsHashSetWithInitialSizeSet ​​... 1000 avgt 2 12.740 us / op givenCollectionsHashSetWithInitialSizeSet ​​... 10000 avgt 2 109.803 us / op givenFastUtilsIntSetWithInitialSizeSet ​​... 100 avgt 2 0.369 us / op givenFastUtilsIntSetWithInitialSizeSet ​​... 1000 avgt 2 2.351 us / op givenFastUtilsIntSetWithInitialSizeSet ​​... 10000 avgt 2 37.789 us / op givenFasttilSett

Disse resultatene gjør det klartFastUtils implementering er mye mer effektiv enn Java Collections-alternativet.

5. Store samlinger

En annen viktig funksjon av FastUtils er muligheten til å bruke 64-bit matriser. Arrays i Java er som standard begrenset til 32 bits.

For å komme i gang, la oss ta en titt på BigArrays klasse for Heltall typer. IntBigArrays gir statiske metoder for å jobbe med 2-dimensjonal Heltall arrays. Ved å bruke disse metodene kan vi i det vesentlige pakke matrisen vår inn i en mer brukervennlig 1-dimensjonal matrise.

La oss ta en titt på hvordan dette fungerer.

Først starter vi med å initialisere en 1-dimensjonal matrise, og konvertere den til en 2-dimensjonal matrise ved hjelp av IntBigArray's wrap metode:

int [] oneDArray = new int [] {2, 1, 5, 2, 1, 7}; int [] [] twoDArray = IntBigArrays.wrap (oneDArray.clone ());

Vi burde sørg for å bruke klone metode for å sikre en dyp kopi av matrisen.

Nå, som vi ville gjort med en Liste eller a Kart, kan vi få tilgang til elementene ved hjelp av metode:

int firstIndex = IntBigArrays.get (twoDArray, 0); int lastIndex = IntBigArrays.get (twoDArray, IntBigArrays.length (twoDArray) -1);

Til slutt, la oss legge til noen sjekker for å sikre IntBigArray returnerer de riktige verdiene:

assertEquals (2, firstIndex); assertEquals (7, lastIndex);

6. Konklusjon

I denne artikkelen har vi tatt en dykk ned i FastUtils kjernefunksjoner.

Vi så på noen av typespesifikke samlinger som FastUtil tilbud, før du leker med noen BigCollections.

Som alltid kan koden bli funnet på GitHub


$config[zx-auto] not found$config[zx-overlay] not found