Gids voor FastUtil

1. Inleiding

In deze tutorial kijken we naar de FastUtil bibliotheek.

Eerst zullen we enkele voorbeelden van zijn typespecifieke collecties.

Vervolgens analyseren we het prestatie die geeft FastUtil Zijn naam.

Laten we tot slot eens kijken naar FastUtil‘S BigArray Gereedschap.

2. Kenmerken

De FastUtil Java-bibliotheek probeert het Java Collections Framework uit te breiden. Het zorgt voor typespecifieke kaarten, sets, lijsten en wachtrijen met een kleinere geheugenvoetafdruk en snelle toegang en plaatsing. FastUtil biedt ook een set van hulpprogramma's voor het werken met en manipuleren van grote (64-bits) arrays, sets en lijsten.

De bibliotheek bevat ook een veel praktische input / output-klassen voor binaire en tekstbestanden.

De nieuwste release, FastUtil 8, heeft ook een groot aantal typespecifieke functies uitgebracht, waarmee de JDK's werden uitgebreid Functionele interfaces.

2.1. Snelheid

In veel gevallen is het FastUtil implementaties zijn de snelste die beschikbaar zijn. De auteurs hebben zelfs hun eigen diepgaande benchmarkrapport geleverd, waarin ze het vergelijken met vergelijkbare bibliotheken HPPC en Trove.

In deze tutorial zullen we proberen onze eigen benchmarks te definiëren met behulp van de Java Microbench Harness (JMH).

3. Volledige afhankelijkheid

Bovenop het gebruikelijke JUnit afhankelijkheid, zullen we de FastUtils en JMH afhankelijkheden in deze tutorial.

We hebben de volgende afhankelijkheden nodig in onze pom.xml het dossier:

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

Of voor Gradle-gebruikers:

testCompile groep: 'org.openjdk.jmh', naam: 'jmh-core', versie: '1.19' testCompile groep: 'org.openjdk.jmh', naam: 'jmh-generator-annprocess', versie: '1.19' compileer groep: 'it.unimi.dsi', naam: 'fastutil', versie: '8.2.2'

3.1. Aangepast Jar-bestand

Vanwege het ontbreken van generieke geneesmiddelen, FastUtils genereert een groot aantal typespecifieke klassen. En helaas leidt dit tot een enorm jar-bestand.

Gelukkig voor ons, FastUtils bevat een find-deps.sh script waarmee u kleinere, meer gerichte potten kunt genereren bestaande uit alleen de klassen die we in onze applicatie willen gebruiken.

4. Typespecifieke verzamelingen

Laten we, voordat we beginnen, een korte blik werpen op het eenvoudige proces voor het instantiëren van een typespecifieke verzameling. Laten we een Hash kaart die sleutels en waarden opslaat met verdubbelt.

Voor dit doeleinde, FastUtils verschaft een Double2DoubleMap interface en een Double2DoubleOpenHashMap implementatie:

Double2DoubleMap d2dMap = nieuwe Double2DoubleOpenHashMap ();

Nu we onze klasse hebben geïnstantieerd, kunnen we eenvoudig gegevens invullen zoals we dat zouden doen Kaart van de Java Collections API:

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

Ten slotte kunnen we controleren of de gegevens correct zijn toegevoegd:

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

4.1. Prestatie

FastUtils richt zich op zijn performante implementaties. In deze sectie maken we gebruik van de JMH om dat feit te verifiëren. Laten we de Java-verzamelingen vergelijken HashSet implementatie tegen FastUtil's IntOpenHashSet.

Laten we eerst eens kijken hoe we het IntOpenHashSet:

@Param ({"100", "1000", "10000", "100000"}) public int setSize; @Benchmark openbare IntSet gegevenFastUtilsIntSetWithInitialSizeSet_whenPopulated_checkTimeTaken () {IntSet intSet = nieuwe IntOpenHashSet (setSize); voor (int i = 0; i <setSize; i ++) {intSet.add (i); } return intSet; }

Hierboven hebben we eenvoudig de IntOpenHashSet implementatie van de IntSet koppel. We hebben ook de oorspronkelijke maat aangegeven setSize met de @Param annotatie.

Simpel gezegd, deze cijfers worden in JMH ingevoerd om een ​​reeks benchmarktests met verschillende setgroottes te produceren.

De volgende, laten we hetzelfde doen met de implementatie van Java Collections:

@Benchmark public Set givenCollectionsHashSetWithInitialSizeSet_whenPopulated_checkTimeTaken () {Set intSet = nieuwe HashSet (setSize); voor (int i = 0; i <setSize; i ++) {intSet.add (i); } return intSet; }

Laten we tot slot de benchmark uitvoeren en de twee implementaties vergelijken:

Benchmark (setSize) Mode Cnt Score Eenheden gegevenCollectionsHashSetWithInitialSizeSet ​​... 100 gemiddelde 2 1.460 us / op gegevenCollectionsHashSetWithInitialSizeSet ​​... 1000 gemiddelde 2 12.740 us / op gegevenCollectionsHashSetWithInitialSizeSet ​​... / op gegevenFastUtilsIntSetWithInitialSizeSet ​​... 100 gem. 2 0.369 us / op gegevenFastUtilsIntSetWithInitialSizeSet ​​... 1000 gem. 2 2.351 ons / op gegevenFastUtilsIntSetWithInitialSizeSet ​​... 10000 gemiddelde gebruik ...

Deze resultaten maken het duidelijk dat hetFastUtils implementatie is veel performanter dan het alternatief voor Java Collections.

5. Grote collecties

Een ander belangrijk kenmerk van FastUtils is de mogelijkheid om 64-bits arrays te gebruiken. Arrays in Java zijn standaard beperkt tot 32 bits.

Laten we om te beginnen eens kijken naar het BigArrays klasse voor Geheel getal types. IntBigArrays biedt statische methoden voor het werken met 2-dimensionaal Geheel getal arrays. Door deze meegeleverde methoden te gebruiken, kunnen we onze array in wezen in een gebruiksvriendelijkere 1-dimensionale array verpakken.

Laten we eens kijken hoe dit werkt.

Eerst beginnen we met het initialiseren van een 1-dimensionale array, en deze converteren naar een 2-dimensionale array met De omslag van IntBigArray methode:

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

We zouden zorg ervoor dat u de kloon methode om een ​​diepe kopie van de array te garanderen.

Nu, zoals we zouden doen met een Lijst of een Kaart, kunnen we toegang krijgen tot de elementen met behulp van de krijgen methode:

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

Laten we tot slot enkele controles toevoegen om ervoor te zorgen dat onze IntBigArray geeft de juiste waarden terug:

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

6. Conclusie

In dit artikel hebben we een erin duiken FastUtils kernfuncties.

We hebben gekeken naar enkele van de typespecifieke collecties die FastUtil aanbiedingen, voordat je met wat speelt BigCollections.

Zoals altijd is de code te vinden op GitHub