Sciologness
Home |

Ak je bitmapa rýchlejší ako celočíselné zoznamu?

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. results 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
...
Sciologness.com ©

Contact form | Terms of use | Privacy policy | Cookie policy
The Sciologness.com™ agent utility uses data collection technology to conveniently update multiple PC drivers. Drivers are the property and the responsibility of their respective manufacturers, and may also be available for free directly from manufacturers' websites. Sciologness.com is not responsible in any way for the performance of or issues caused by any third-party drivers.Drivers may also be available for free directly from manufacturers' websites. Microsoft and Windows are either registered trademarks or trademarks of Microsoft Corporation in the United States and/or other countries. Any other third-party products, brands or trademarks listed above are the sole property of their respective owner. No affiliation or endorsement is intended or implied.