Sprievodca po FastUtil

1. Úvod

V tomto výučbe sa pozrieme na FastUtil knižnica.

Najprv si napíšeme niekoľko jeho príkladov typovo špecifické zbierky.

Potom analyzujeme výkon, ktorý dáva FastUtil jeho meno.

Nakoniec poďme nakuknúť FastUtil‘S BigArray inžinierske siete.

2. Funkcie

The FastUtil Knižnica Java sa snaží rozšíriť rámec Java Collections Framework. To poskytuje typovo špecifické mapy, súpravy, zoznamy a rady s menšou pamäťovou stopou a rýchlym prístupom a vkladaním. FastUtil tiež poskytuje súbor pomocné programy na prácu s veľkými (64-bitovými) poľami, množinami a zoznamami a manipuláciu s nimi.

Súčasťou knižnice je aj množstvo praktických tried vstupu / výstupu pre binárne a textové súbory.

Jeho posledné vydanie, FastUtil 8, tiež vydal rad typovovo špecifických funkcií, rozširujúcich JDK Funkčné rozhrania.

2.1. Rýchlosť

V mnohých prípadoch FastUtil implementácie sú najrýchlejšie dostupné. Autori dokonca poskytli vlastnú podrobnú referenčnú správu, ktorá ju porovnáva s podobnými knižnicami HPPC a Trove.

V tomto tutoriáli sa pozrieme na definovanie vlastných benchmarkov pomocou Java Microbench Harness (JMH).

3. Závislosť plnej veľkosti

Na vrchole obvyklých JUnit závislosť, budeme používať FastUtils a JMH závislosti v tomto návode.

Budeme potrebovať nasledujúce závislosti v našom pom.xml spis:

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

Alebo pre používateľov Gradle:

skupina testCompile: „org.openjdk.jmh“, názov: „jmh-core“, verzia: „1.19“ skupina testCompile: „org.openjdk.jmh“, názov: „jmh-generator-annprocess“, verzia: „1,19“ skupina kompilácií: 'it.unimi.dsi', názov: 'fastutil', verzia: '8.2.2'

3.1. Prispôsobený súbor Jar

Kvôli nedostatku generík FastUtils generuje veľké množstvo typov špecifických pre daný typ. A bohužiaľ to vedie k obrovský súbor jar.

Našťastie pre nás, FastUtils zahŕňa a find-deps.sh skript, ktorý umožňuje generovanie menších a viac zameraných nádob obsahuje iba triedy, ktoré chceme použiť v našej aplikácii.

4. Zbierky špecifické pre daný typ

Než začneme, poďme sa rýchlo pozrieť na jednoduchý proces vytvorenia inštancie kolekcie špecifickej pre daný typ. Vyberieme a HashMap ktorý ukladá kľúče a hodnoty pomocou štvorhra.

Pre tento účel, FastUtils poskytuje a Double2DoubleMap rozhranie a Double2DoubleOpenHashMap implementácia:

Double2DoubleMap d2dMap = nový Double2DoubleOpenHashMap ();

Teraz, keď sme vytvorili inštanciu našej triedy, môžeme údaje jednoducho vyplniť, ako by to bolo v prípade ktorejkoľvek z nich Mapa z rozhrania Java Collections API:

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

Na záver môžeme skontrolovať, či boli údaje pridané správne:

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

4.1. Výkon

FastUtils sa zameriava na jeho výkonné implementácie. V tejto časti využijeme JMH na overenie tejto skutočnosti. Poďme si porovnať zbierky Java HashSet implementácia proti FastUtil's IntOpenHashSet.

Najprv sa pozrime, ako implementovať IntOpenHashSet:

@Param ({"100", "1000", "10 000", "100000"}) public int setSize; @Benchmark public IntSet givenFastUtilsIntSetWithInitialSizeSet_whenPopulated_checkTimeTaken () {IntSet intSet = nový IntOpenHashSet (setSize); pre (int i = 0; i <setSize; i ++) {intSet.add (i); } návrat intSet; }

Vyššie sme jednoducho deklarovali IntOpenHashSet implementácia IntSet rozhranie. Tiež sme deklarovali pôvodnú veľkosť setSize s @Param anotácia.

Zjednodušene povedané, tieto čísla sa vkladajú do JMH, aby sa vytvoril rad referenčných testov s rôznymi veľkosťami súborov.

Ďalšie, urobme to isté pomocou implementácie Java Collections:

@Benchmark public Set givenCollectionsHashSetWithInitialSizeSet_whenPopulated_checkTimeTaken () {Set intSet = new HashSet (setSize); pre (int i = 0; i <setSize; i ++) {intSet.add (i); } návrat intSet; }

Na záver spustíme benchmark a porovnáme dve implementácie:

Benchmark (setSize) Režim Cnt Skóre Jednotky danéCollectionsHashSetWithInitialSizeSet ​​... 100 priem. 2 1,460 us / op danéCollectionsHashSetWithInitialSizeSet ​​... 1000 priem. 2 12,740 us / op danéCollectionsHashSetWithInitialSizeSet ​​... 10000 priem. / op danéFastUtilsIntSetWithInitialSizeSet ​​... 100 priem. 2 0,369 nás / op dané FastUtilsIntSetWithInitialSizeSet ​​... 1 000 priem. 2 2,351 us / op dané FastUtilsIntSetWithInitialSizeSet ​​... 10 000 priem. 2 37 789 us / op

Tieto výsledky objasňujúFastUtils implementácia je oveľa efektívnejšia ako alternatíva Java Collections.

5. Veľké zbierky

Ďalším dôležitým vlastnosť FastUtils je schopnosť používať 64-bitové polia. Polia v prostredí Java sú predvolene obmedzené na 32 bitov.

Na začiatok sa pozrime na BigArrays trieda pre Celé číslo typy. IntBigArrays poskytuje statické metódy pre prácu s 2-dimenzionálnymi Celé číslo polia. Použitím týchto poskytnutých metód môžeme v podstate zabaliť naše pole do užívateľsky prívetivejšieho jednorozmerného poľa.

Poďme sa pozrieť na to, ako to funguje.

Najskôr začneme inicializáciou jednorozmerného poľa a jeho prevedením na dvojrozmerné pole pomocou Zábal IntBigArray metóda:

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

Mali by sme uistite sa, že používate klon metóda na zabezpečenie hlbokej kópie poľa.

Teraz, ako by sme to robili s Zoznam alebo a Mapa, môžeme získať prístup k prvkom pomocou dostať metóda:

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

Na záver pridáme niekoľko kontrol, aby sme zaistili našu IntBigArray vráti správne hodnoty:

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

6. Záver

V tomto článku sme prijali a ponoriť sa do FastUtils základné vlastnosti.

Pozreli sme sa na niektoré z typovo špecifické zbierky, ktoré FastUtil ponuky, skôr ako sa s niektorými pohráte Veľké zbierky.

Ako vždy, kód nájdete na GitHub


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