Eric Lengyel dobrovolně uvolnil jako volné dílo svůj patentovaný algoritmus Slug. Algoritmus vykresluje text a vektorovou grafiku na GPU přímo z dat Bézierových křivek, aniž by využíval texturové mapy obsahující jakékoli předem vypočítané nebo uložené obrázky a počítá přesné pokrytí pro ostré a škálovatelné zobrazení písma, referenční ukázka implementace v HLSL shaderech je na GitHubu. Slug je volným dílem od 17. března letošního
… více »Sashiko (GitHub) je open source automatizovaný systém pro revizi kódu linuxového jádra. Monitoruje veřejné mailing listy a hodnotí navrhované změny pomocí umělé inteligence. Výpočetní zdroje a LLM tokeny poskytuje Google.
Cambalache, tj. RAD (rapid application development) nástroj pro GTK 4 a GTK 3, dospěl po pěti letech vývoje do verze 1.0. Instalovat jej lze i z Flathubu.
KiCad (Wikipedie), sada svobodných softwarových nástrojů pro počítačový návrh elektronických zařízení (EDA), byl vydán v nové major verzi 10.0.0 (𝕏). Přehled novinek v příspěvku na blogu.
Letošní Turingovou cenu (2025 ACM A.M. Turing Award, Nobelova cena informatiky) získali Charles H. Bennett a Gilles Brassard za základní přínosy do oboru kvantové informatiky, které převrátily pojetí bezpečné neprolomitelné komunikace a výpočetní techniky. Jejich protokol BB84 z roku 1984 umožnil fyzikálně zaručený bezpečný přenos šifrovacích klíčů, zatímco jejich práce o kvantové teleportaci položila teoretické základy pro budoucí kvantový internet. Jejich práce spojila fyziku s informatikou a ovlivnila celou generaci vědců.
Firefox 149 dostupný od 24. března přinese bezplatnou vestavěnou VPN s 50 GB přenesených dat měsíčně (s CZ a SK se zatím nepočítá) a zobrazení dvou webových stránek vedle sebe v jednom panelu (split view). Firefox Labs 149 umožní přidat poznámky k panelům (tab notes, videoukázka).
Byla vydána nová stabilní verze 7.9 webového prohlížeče Vivaldi (Wikipedie). Postavena je na Chromiu 146. Přehled novinek i s náhledy v příspěvku na blogu.
Dle plánu byla vydána Opera GX pro Linux. Ke stažení je .deb i .rpm. V plánu je flatpak. Opera GX je webový prohlížeč zaměřený na hráče počítačových her.
GNUnet (Wikipedie) byl vydán v nové major verzi 0.27.0. Jedná se o framework pro decentralizované peer-to-peer síťování, na kterém je postavena řada aplikací.
Byly publikovány informace (technické detaily) o bezpečnostním problému Snapu. Jedná se o CVE-2026-3888. Neprivilegovaný lokální uživatel může s využitím snap-confine a systemd-tmpfiles získat práva roota.
Ř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.
Ale jinak mas pravdu a asi se to nevyplati.
uz jsem ale nezkontroloval ze i jinym zpusobem se nahodou dostanes ke stejnymu vysledku.
Takze to tady asi muzeme ukoncit s tim ze je to spravne.
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: