Vývojáři KDE ve spolupráci se společností Slimbook oznámili 16palcový notebook KDE Slimbook VI s předinstalovaným KDE Neon s Plasmou 6. Uvnitř se nachází procesorem AMD Ryzen 7 8845HS s integrovanou grafickou kartou Radeon 780M.
Ve Würzburgu dnes začala konference vývojářů a uživatelů desktopového prostředí KDE Akademy 2024. Sledovat lze také online (YouTube, Mastodon, 𝕏, …)
Byla vydána nová major verze 14 svobodného systému pro řízení přístupu k síti (NAC) PacketFence (Wikipedie). Přehled novinek v oznámení o vydání. Pro uživatele předchozích verzí jsou k dispozici poznámky k aktualizaci.
Jak nahrávat zvuk z webového prohlížeče na Linuxu s PipeWire pomocí Nahrávání zvuku (Sound Recorder) a Helvum případně qpwgraph, článek na webu Libre Arts.
Open source platforma Home Assistant (Demo, GitHub, Wikipedie) pro monitorování a řízení inteligentní domácnosti byla vydána ve verzi 2024.9.
České bezpečnostní instituce, jmenovitě Vojenské zpravodajství (VZ) a Bezpečnostní informační služba (BIS), ve spolupráci s americkou Agenturou pro kybernetickou a infrastrukturní bezpečnost (CISA), Federálním úřadem pro vyšetřování (FBI), Národní bezpečností agenturou (NSA) a dalšími mezinárodními partnery ze Spojeného království, Austrálie, Kanady, Německa, Nizozemska, Estonska, Ukrajiny a Lotyšska vydaly upozornění (
… více »Byla vydána (𝕏) srpnová aktualizace aneb nová verze 1.93 editoru zdrojových kódů Visual Studio Code (Wikipedie). Přehled novinek i s náhledy a animovanými gify v poznámkách k vydání. Ve verzi 1.93 vyjde také VSCodium, tj. komunitní sestavení Visual Studia Code bez telemetrie a licenčních podmínek Microsoftu.
Společnost Laravel stojící za stejnojmenným open source PHP frameworkem získala investici 57 milionů dolarů od společnosti Accel. Především na Laravel Cloud.
Byla vydána verze 1.81.0 programovacího jazyka Rust (Wikipedie). Podrobnosti v poznámkách k vydání. Řešena je také zranitelnost CVE-2024-43402. Vyzkoušet Rust lze například na stránce Rust by Example.
Řešení dotazu:
char **items = (char**)malloc(sizeof(char*)*POCET_ZAZNAMOV); for (i=0; i<POCET_ZAZNAMOV; i++) { items[i] = (char*)malloc(sizeof(char)*35); ... nacitam items[i] zo suboru }Vecer asi skusim tie hashe.
Když už takhle, tak už by (za předpokladu rovnoměrného rozložení řetězců) bylo efektivnější to menší pole také půlit, tj. nejdřív najít prostřední prvek a pak aplikovat totéž na levou a pravou polovinu kratšího pole.
Případně pokud sekvenčně, tak ale nepůlit, ale vycházet z toho, že má-li dlouhé pole n prvků a krátké k, měli bychom první prvek hledat spíš kolem pozice n/k (možná dokonce spíš n/2k, nechce se mi to teď počítat) než n/2. Obdobně pak v dalších krocích.
Rozumím tomu dobře, že hledáš jen přesnou shodu položky pole s hledaným řetězcem a že to pole máš a řešíš jen rychlost vyhledání?
Jsem z toho trochu zmatený, píše se tady o haších apod., ale pokud vezmu takovouto zahrádku (rozuměj malé políčko 10M × 42 znaků ;)), pomocí qsort jej setřídím (náročné na čas ≈12sec), tak pomocí třeba bsearch hledám velmi hluboko pod 1 sec (0.000006) - vždyť je to jen 23 porovnání - co jsem nepochopil?
Jak již kdosi zmínil, prvním krokem je použití hashovací funkce. Řetězec přeložíte na číslo K, které vám přímo určí index do pole. V poli pak máte (druhé velmi malé) pole (možná spíše spojový seznam) řetězců, které již sekvenčně porovnáte se zadaným řetězcem. V zásadě je to místo bi-sekce ( dělení na půl ) dělení na N, kde N je počet různých K, které vylézají z hash funkce.
Asi bych zamířil směrem k perfect hash funkci a snažil se tak vyhnout prohledávání druhého (malého) pole. Můžete třeba zkusit gperf.
Pokud by vám hashování nestačilo a počet úspěšných testů na shodu byl malý (<20%), tak můžete zkusit nasadit Bloomův filter. Tím by jste si mohl ušetřit, 90% práce s pamětí a fungovat jen na úrovni CPU cache.
Obecně věc takto napsaná pod 10µs už nemá rozhodně cenu řešit, protože pokud se to má používat jednou, tak je jedno jestli je to 10µs nebo 10ms (tedy v 99.99% případů). Obecně to lze zrychlit práci s pamětí nebo segmentací, 24 iterací je prostě nic, režie jsou jinde.
No a pokud se to má používat opakovaně ve velkém, tak jsou mnohem důležitější věci v tom opakovaně, které daleko zásadněji ovlivní výslednou rychlost. V tomto případě, i cache na CPU a jak se rozdělí vlákna na Multi-Core-HT CPU.
bsearch
může klidně na 100 záznamech produkovat stejný čas jako na 10000 apod.
bsearch
nad 10M int
-ů a mám 12 až 21nsec existujících a neexistujících 60 až 110nsec. Atom bude asi mít o kus nižší takt než Phenom II (a o ten tady jde), takže bych byl opatrnější s tím pod 100ns.
memcmp()
když už se honí každý tick.bsearch
nad int, klasický bsearch
má vždy plný počet kroků při neexistenci, při existenci jich může mít méně (záleží na implementaci, ale řekl bych, že se obecně používají tak dvě, které to dělají).
Můžu se zeptat kolika bitový bloom filter jste použil? Zrychlení na na 4/6 u mezi variantami bloom+hash vs. hash u 100% neshody se mi zdá málo. Čekal bych o něco lepší výsledek. Jaká byla úspěšnost bloomova filtru?
Trošku mě to zajímalo (někdy je třeba se nudit ;)), tak jsem si to zkusil bez „woodoo“ a „pracně“ :) (jen přímým indexováním a qsort a bsearch).
Časy jsou v nano-sekundách na záznam při 10M záznamech délky 30-35 znaků (délky 30-35 rovnoměrně obsažené) náhodně vygenerovaných z 58 znaků (nejčastější běžné znaky).
V prvním sloupci jsem provedl rozdělení dle délky (tedy rozdělení na 6 množin) /všechny uváděné časy jsou 'existující-neexistující'/,
v druhém sloupci jsem přidal index podle prvního písmena (díky náhodnému generování dochází k velmi rovnoměrnému rozložení - máme 6 rovnoměrný nadskupin, 6*255 podksupin kde v 6*58 je to rovnoměrně rozložené) a
v třetím jen velmi jednoduše přidal OpenMP na hledací smyčku.
Časy v závorce jsou pro řetězce obsahující 1-255 znaky (binární string bez '\0'), díky lepšímu rozložení se to pak trochu zkracuje/rovnoměrně dělí do 6*255 skupin.
Každé hledání používá fci strlen()
pro zjištění délky momentálně hledaného řetěze, bez zjišťování délky jsou hodnoty v [ ] (Byť jsem se snažil dělat testy na systému v klidu, jak vidno záleží na aktuálním stavu, bo ne vždy to mělo logický efekt).
Length 1st Letter 1st Letter-MP Intel(R) Atom(TM) CPU N270 @ 1.60GHz 2689-3475 871-891 918-918 [923]? Intel(R) Core(TM)2 CPU 6600 @ 2.40GHz 1167-1496 410-411 167-175 [141] (153-154 [117]) Intel(R) Core(TM) i7 CPU M 640 @ 2.80GHz 782-1118 110-112 64- 67 [ 68]? *Intel(R) Xeon(R) CPU E3-1230 V2 @ 3.30GHz 2× 536- 723 134-134 74- 68 [ 58] *Intel(R) Xeon(R) CPU E3-1230 V2 @ 3.30GHz 8× 541- 729 102-102 34- 36 [ 29] (30- 32 [ 24])
Atom je jednojádro HT, 2. je Core2Duo,3 je NTB i7, a Xeon čtyř-HT-jádro, ale ve virtuálu poprvé přidělení 2×CPU podruhé 8×CPU (ale je v zasadě jedno jestli 4 nebo 8 jádra nebo 4-16 povolených threadů, na toto HT nepomáhá, časy byly „stejné“).
CPU: Intel(R) Atom(TM) CPU D410 @ 1.66GHz Mem: 1996, Free: 494 Vsetky Ziadne Algoritmus 0.764us 0.846us bisect 0.656us 0.523us hsearch 1.306us 0.535us bloom+bisect (miss 100.00%, 1.97%) 1.168us 0.514us bloom+hsearch (miss 100.00%, 1.97%) 0.539us 0.459us GHashTablePrvy stlpec udava primerny cas 1 hladania ak sme hladali len take hodnoty ktore sa v poli nachadzaju. Druhy stlpec udava cas 1 hladania ak sme hladali len take hodnoty ktore sa v poli nenachadzaju. Udaj v zatvorke u bloom udava kolko krat vratil pozitivny vysledok v prvom a druhom stlpci. Napr. u mna v 2% vysledkov bloom filter vratil false positive. Kompilujte takto: make && make data && make test run Zda sa teda ze GHashTable je najrychlejsia.
POCET 1000000
v nahodne_data.c) ne za 10M? (s 35 znaky).
CPU: Intel(R) Core(TM) i5-2520M CPU @ 2.50GHz /bin/sh: free: command not found Vsetky Ziadne Algoritmus 0.184us 0.203us bisect 0.255us 0.238us hsearch 0.336us 0.157us bloom+bisect (miss 100.00%, 1.97%) 0.407us 0.154us bloom+hsearch (miss 100.00%, 1.97%) 0.233us 0.155us GHashTablepro 10Mx35:
CPU: Intel(R) Core(TM) i5-2520M CPU @ 2.50GHz /bin/sh: free: command not found Vsetky Ziadne Algoritmus 0.212us 0.231us bisect 0.281us 0.287us hsearch 0.390us 0.178us bloom+bisect (miss 100.00%, 1.99%) 0.469us 0.181us bloom+hsearch (miss 100.00%, 1.99%) 0.276us 0.179us GHashTablepro 1Mx250:
CPU: Intel(R) Core(TM) i5-2520M CPU @ 2.50GHz /bin/sh: free: command not found Vsetky Ziadne Algoritmus 0.267us 0.224us bisect 0.659us 0.593us hsearch 0.849us 0.602us bloom+bisect (miss 100.00%, 1.99%) 1.247us 0.602us bloom+hsearch (miss 100.00%, 1.99%) 0.597us 0.444us GHashTablezkusil jsem puvodne 1Mx350, ale padlo mi na segfault.
Tiskni Sdílej: