Byla vydána beta verze Linux Mintu 22.2 s kódovým jménem Zara. Podrobnosti v přehledu novinek a poznámkách k vydání. Vypíchnout lze novou XApp aplikaci Fingwit pro autentizaci pomocí otisků prstů nebo vlastní fork knihovny libAdwaita s názvem libAdapta podporující grafická témata. Linux Mint 22.2 bude podporován do roku 2029.
Provozovatel internetové encyklopedie Wikipedie prohrál v Británii soudní spor týkající se některých částí nového zákona o on-line bezpečnosti. Soud ale varoval britského regulátora Ofcom i odpovědné ministerstvo před zaváděním přílišných omezení. Legislativa zpřísňuje požadavky na on-line platformy, ale zároveň čelí kritice za možné omezování svobody slova. Společnost Wikimedia Foundation, která je zodpovědná za fungování
… více »Byla vydána verze 2.0.0 nástroje pro synchronizaci dat mezi vícero počítači bez centrálního serveru Syncthing (Wikipedie). Přehled novinek na GitHubu.
Americký prezident Donald Trump se v pondělí osobně setkal s generálním ředitelem firmy na výrobu čipů Intel Lip-Bu Tanem. Šéfa podniku označil za úspěšného, informují agentury. Ještě před týdnem ho přitom ostře kritizoval a požadoval jeho okamžitý odchod. Akcie Intelu v reakci na schůzku po oficiálním uzavření trhu zpevnily asi o tři procenta.
Byl vydán Debian GNU/Hurd 2025. Jedná se o port Debianu s jádrem Hurd místo obvyklého Linuxu.
V sobotu 9. srpna uplynulo přesně 20 let od oznámení projektu openSUSE na konferenci LinuxWorld v San Franciscu. Pokuď máte archivní nebo nějakým způsobem zajímavé fotky s openSUSE, můžete se o ně s námi podělit.
Byl vydán Debian 13 s kódovým názvem Trixie. Přehled novinek v poznámkách k vydání.
WLED je open-source firmware pro ESP8266/ESP32, který umožňuje Wi-Fi ovládání adresovatelných LED pásků se stovkami efektů, synchronizací, audioreaktivním módem a Home-Assistant integrací. Je založen na Arduino frameworku.
Open source platforma Home Assistant (Demo, GitHub, Wikipedie) pro monitorování a řízení inteligentní domácnosti byla vydána v nové verzi 2025.8.
Herní studio Hangar 13 vydalo novou Mafii. Mafia: Domovina je zasazena do krutého sicilského podsvětí na začátku 20. století. Na ProtonDB je zatím bez záznamu.
Ř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: