Môžete si predstavovať zoznam rôznych celých čísel nie je väčšia ako N pomocou presne N bitov: ak integer aj zobrazí v zozname, môžete nastaviť aj ty bit na hodnotu true. Bity, pre ktoré neexistuje zodpovedajúci celé čísla sú nastavená na hodnotu false. Napríklad, môžu byť celé čísla 3, 4, 7 byť reprezentované ako 00011001. Ako ďalší príklad možno celé čísla 1, 2, 7 byť reprezentované ako 01100001.
Bitmapy sú skvelé pre výpočet priesečníkov a odbory rýchlo. Ak chcete napríklad vypočítať spojenie medzi 3, 4, 7 a 1, 2, 7, všetko, čo potrebujete urobiť, je spočítať bitové OR medzi 00011001 a 01100001 (= 01111001), ktorý počítač dokáže v jednom procesore cyklu. Podobne možno križovatka byť počítaný ako bitový AND medzi 00011001 a 01100001 (= 00000001).
I keď to nemusí nutne využiť fantázie inštrukcií SSE na vašej pracovnej ploche, bitmapy sú však príkladom
vektorizácia. To znamená, že sa používajú k tomu, že procesor môže spracovať viac bitov s jednej inštrukcie.
Tam sú niektoré nevýhody bitmapového prístupu: musíte najprv postaviť na bitmapy a potom budete musieť extrahovať sadu bitov. Našťastie, tam sú rýchle
algoritmy pre dekódovať bitmapy.
Avšak, nemôžeme očakávať, že bitmapy byť vždy rýchlejší. Ak väčšina bity sú nastavené na false, potom ste lepšie pracuje cez sad triedených celých čísel. Tak kde je prah?
Rozhodol som sa použiť
JavaEWAH knižnicu vyskúšať si to. Táto knižnica sa používa, okrem iného tým, že Ulu
Apache na index otázky cez Hadoop. JavaEWAH používa komprimované bitmapy (pozri
Lemire et al. 2010), podrobnosti namiesto jednoduchých rastrových obrázkov som len opísal, ale základná myšlienka ostáva rovnaká. Tiež som pridal jednoduchšie
riedku rastrový vykonávanie tohto testu.
Aj generované náhodných čísel pomocou modelu ClusterData navrhnutú
Vo Ngoc Anh Alistair Moffat. Je to slušný model pre "real-svet údajov".
Zvážte výpočet priesečníka medzi dvoma náhodnými súbory celých čísel. Nasledujúci obrázok udáva rýchlosť (v mil celých za sekundu) oproti hustota meranej ako počet celých čísel rozdelených podľa rozsahu hodnôt.

Bežal som test na počítači Core i7.
Záver: Nie je prekvapením, break-i riedkosť pre JavaEWAH je asi 1/32: ak máte viac ako 1000 celé čísla v rozmedzí [0,32000) a potom bitmapy môže byť rýchlejší. Samozrejme, lepšie rýchlosť je možné s určitou optimalizáciu a vaše dáta sa môžu líšiť od mojich syntetických dát, ale máme približný odhad. Jednoduchšie
riedke bitmapový implementácia môže byť užitočné v priebehu redšie údajov hoci to je v cene: najlepšie rýchlosť je znížená v porovnaní s EWAH.
Zdrojový kód: Ako obvykle, som poskytovať
kompletný zdrojový kód, takže môžete reprodukovať svoje výsledky.
Aktualizácia: Tento príspevok bol aktualizovaný na 26 októbra 2012.
Preložené z
http://lemire.me/blog/archives/2012/10/23/when-is-a-bitmap-faster-than-an-integer-list/
Homepage