Útmutató a FastUtilhoz

1. Bemutatkozás

Ebben az oktatóanyagban megnézzük a FastUtil könyvtár.

Először kódolunk néhány példát típus-specifikus gyűjtemények.

Majd elemezzük a teljesítményt nyújt FastUtil annak a neve.

Végül nézzünk be FastUtil’S BigArray segédprogramok.

2. Jellemzők

A FastUtil A Java könyvtár megpróbálja kibővíteni a Java gyűjtemények keretrendszerét. Ez biztosítja típus-specifikus térképek, halmazok, listák és sorok kisebb memóriaterülettel, gyors hozzáféréssel és behelyezéssel. FastUtil készletet is nyújt segédprogramok nagy (64 bites) tömbök, halmazok és listák kezeléséhez és kezeléséhez.

A könyvtárhoz tartozik még a gyakorlati Input / Output osztályok sokasága bináris és szöveges fájlokhoz.

A legújabb kiadás, FastUtil 8, emellett számos típus-specifikus funkciót is kiadott, kiterjesztve a JDK-kat Funkcionális interfészek.

2.1. Sebesség

Sok esetben a FastUtil a megvalósítások a leggyorsabban elérhetőek. A szerzők saját mélyreható referencia jelentést is készítettek, összehasonlítva a hasonló könyvtárakkal HPPC és Trove.

Ebben az oktatóanyagban arra törekszünk, hogy meghatározzuk saját referenciaértékeinket a Java Microbench Harness (JMH) segítségével.

3. Teljes méretű függőség

A szokásos tetején JUnit függőséget fogjuk használni FastUtils és JMH függőségek ebben az oktatóanyagban.

A következő függőségekre lesz szükségünk pom.xml fájl:

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

Vagy a Gradle felhasználók számára:

testCompile group: 'org.openjdk.jmh', név: 'jmh-core', verzió: '1.19' testCompile group: 'org.openjdk.jmh', név: 'jmh-generator-annprocess', verzió: '1.19' fordítási csoport: 'it.unimi.dsi', név: 'fastutil', verzió: '8.2.2'

3.1. Testreszabott Jar File

A generikumok hiánya miatt FastUtils nagyszámú típus-specifikus osztályt generál. És sajnos ez vezet a hatalmas üvegfájl.

Szerencsénkre azonban FastUtils tartalmazza a find-deps.sh szkript, amely lehetővé teszi kisebb, koncentráltabb üvegek előállítását csak azokból az osztályokból áll, amelyeket az alkalmazásunkban használni szeretnénk.

4. Típus-specifikus gyűjtemények

Mielőtt elkezdenénk, vessünk egy gyors pillantást a típus-specifikus gyűjtemény egyszerűsítésére. Válasszunk egy HashMap amely a kulcsokat és értékeket használja duplázik.

Erre a célra, FastUtils biztosítja a Double2DoubleMap interfész és a Double2DoubleOpenHashMap végrehajtás:

Double2DoubleMap d2dMap = új Double2DoubleOpenHashMap ();

Most, hogy példányosítottuk osztályunkat, egyszerűen feltölthetjük az adatokat, mint bármely mással Térkép a Java Collections API-ból:

d2dMap.put (2,0, 5,5); d2dMap.put (3,0, 6,6);

Végül ellenőrizhetjük az adatok helyes hozzáadását:

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

4.1. Teljesítmény

FastUtils előadói megvalósításaira összpontosít. Ebben a szakaszban a JMH-t fogjuk használni ennek a ténynek az ellenőrzésére. Hasonlítsuk össze a Java gyűjteményeket HashSet végrehajtása ellen FastUtil's IntOpenHashSet.

Először nézzük meg, hogyan kell végrehajtani a IntOpenHashSet:

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

Fent egyszerűen kijelentettük a IntOpenHashSet a IntSet felület. Kijelentettük a kezdeti méretet is setSize a ... val @Param annotáció.

Leegyszerűsítve: ezeket a számokat betáplálják a JMH-ba, hogy különféle méretméretű benchmark teszteket készítsenek.

Következő, tegyük ugyanezt a Java Collections megvalósításával:

@Benchmark public Set megadottCollectionsHashSetWithInitialSizeSet_whenPopulated_checkTimeTaken () {Set intSet = új HashSet (setSize); for (int i = 0; i <setSize; i ++) {intSet.add (i); } return intSet; }

Végül futtassuk a benchmarkot, és hasonlítsuk össze a két megvalósítást:

Benchmark (setSize) Mód Cnt Pontszám egységek adottCollectionsHashSetWithInitialSizeSet ​​... 100 avgt 2 1,460 us / op givenCollectionsHashSetWithInitialSizeSet ​​... 1000 avgt 2 12,740 us / op adottCollectionsHashSetWithInitialSizeSet ​​... 10000 avashSetSet 100Set avatar 2Set 100Set 2Set 100Set 2Set 100Set 2Set 100Set 2Set 100Set 2Set 100Set 2Set 100Set av 2Set 70Set 2Set 100Set 2Set avagy 2Set 100Set avagy 2Set 100Set avagy 2Setet 100Set 2Set avagy 2Setet 100Set avat 2Setet 2 1009 avt 2Setet 2 1009 avt 2Setet 2 1009 avt 2Setet 2 1009 avt 2Setet 1 / 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 GivenFastUtil

Ezek az eredmények egyértelművé teszik aFastUtils a megvalósítás sokkal jobban teljesít, mint a Java Collections alternatívája.

5. Nagy gyűjtemények

Egy másik fontos jellemzője FastUtils a 64 bites tömbök használatának képessége. A Java tömbök alapértelmezés szerint 32 bitre korlátozódnak.

Az induláshoz vessünk egy pillantást a BigArrays osztály részére Egész szám típusok. IntBigArrays statikus módszereket biztosít a kétdimenziósokkal való munkavégzéshez Egész szám tömbök. Ezeknek a módszereknek a felhasználásával lényegében egy felhasználóbarátabb, 1 dimenziós tömbbe csomagolhatjuk a tömböt.

Vessünk egy pillantást ennek működésére.

Először egy 1-dimenziós tömb inicializálásával és 2-dimenziós tömbvé alakításával kezdjük. IntBigArray pakolása módszer:

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

Nekünk kellene feltétlenül használja a klón módszer a tömb mély másolatának biztosítására.

Most, ahogy az a-val tennénk Lista vagy a Térkép, az elemekkel hozzáférhetünk a kap módszer:

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

Végül adjunk hozzá néhány ellenőrzést, hogy megbizonyosodjunk róla IntBigArray a helyes értékeket adja vissza:

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

6. Következtetés

Ebben a cikkben a belemerülni FastUtils alapvető jellemzői.

Megnéztük néhányat típus-specifikus gyűjtemények, amelyek FastUtil felajánlások, mielőtt eljátszana néhányal BigCollections.

Mint mindig, a kód megtalálható a GitHubon