Margaras Unlimited

fediverse instance, která není zavázaná žádné zemi ani žádné známé skupině

k47

@k47@k47.cz

eat the rich
http://k47.cz
https://deadbeef.k47.cz
https://k47.cz/bandcamp/

40/16/32
RSS

k47 @k47 -- Jan 28, 13:42 (0/0/0)

Tyhle volby jsme se úspěšně vyhýbal politickému marketingu https://k47.cz/2023/pol-marketing.html

---
k47 @k47 -- Jan 24, 13:48 (0/0/0)

A hele, GCC skutečně umí generovat lepší binárku, když jsou pointery označené jako restricted.

V mém případě jsem měl několik funkcí ve stylu:

void f(struct *x, char *data) {
  ...
  x->pos += something;
}

Kompilátor je inlinoval, ale protože x a data mohlo ukazovat na stejný kus paměti, musel vždy inkrementovat pos v paměti. S klíčovým slovem restricted pak inkrementoval registr a do paměti ho strčil až na samotném konci. To mělo za následek příjemné 5% zrychlení.

---
k47 @k47 -- Jan 17, 12:58 (1/0/1)

Zajímavý PHP detail: Vypadá to, že je rychlejší konstruovat pole přes explicitní smyčku než přes array_map.

($arr má velikost 8 a funkce id jen vrací svůj argument)

$res = array_map(\id(...), $arr);
interpretr: 401 ns, JIT: 375 ns

$res = array_map('id', $arr);
interpretr: 298 ns, JIT: 280 ns

$res = []; foreach ($arr as $x) $res[] = \id($x);
interpretr: 235 ns, JIT: 132 ns

Volání z PHP do C a pak do PHP něco stojí a zkompilovaná binárka pro JIT představuje neprůhlednou překážkou, napříč kterou nedokáže optimalizovat.

Varianta s array_map stráví 33% času v zend_call_function, který opakovaně dělá zbytečnou práci s validací funkce. To by šlo udělat jen poprvé a pak přeskočit, protože se bude volat stejná funkce se stejným počtem argumentů.
Značné množství času se stráví kontrolou jestli argumenty mají být reference. I když se reference použijí jen okrajově, pořád platí, že můžou bát použity a to zpomalí každé volání každé funkce.
Taky se opakovaně počítá kolik místa je potřeba na PHP zásobníku, což by stačilo udělat jen jednou a cachovat pro další použití.

---
k47 @k47 -- Jan 10, 14:30 (0/0/0)

V literatuře se dá dočíst o velice divokých CPU architekturách. Škoda, že nikdy nic z toho nespatří světlo světa a když ano, nedostane se mi to do rukou.

https://stacks.stanford.edu/file/druid:bp863pb8596/thesis_adobe-augmented.pdf
Tady se snaží navrhnout procesor, který by měl všechny dobré vlastnosti out-of-order jádra, ale nemusel by platit běžnou cenu za OOO.

https://www.cs.cmu.edu/~beckmann/publications/papers/2022.isca.tako.pdf
Tady cache-miss v určité oblasti virtuální paměti vyvolá SW callback.

https://mrmgroup.cs.princeton.edu/papers/infmem_tocs.pdf
Tady navrhují mechanismus jump-on-cache-miss, aby program mohl pozorovat chování cache a paměti. V tomhle prostředí by byly side channel útoky komicky jednoduché. Nemusíme nic časovat, stačí aby se program jednoduše zeptal. (Podobná technika by se dala použít pro GC bariéry.)

---
k47 @k47 -- Jan 08, 15:17 (1/0/0)

In Praise of Idleness z pera Bertranda Russella je neuvěřitelně dobrá knížka. Především pak eseje o fašismu a komunismu. Publikováno v roce 1935, ostré jako břitva a perfektně přesné.

---
k47 @k47 -- Jan 07, 13:43 (0/0/0)

Dnes večer k poslechu a tanci hraje: Pound Land - Zones https://cruelnaturerecordings.bandcamp.com/track/zones

víc na https://k47.cz/hraje/

---
k47 @k47 -- Jan 02, 23:47 (0/0/0)

Poslední věcičku, kterou jsem loni přidal do https://k47.cz/bandcamp/, bylo dopočítávání tagů.

Pár desítek tisíc alb na bandcampu není otagováno vůbec nebo je otagováno špatně. Z toho důvodu se nemůžou dostat do seznamů a RSS exportů. Naštěstí se to dá jednoduše napravit, pokud má album aspoň nějaké fanoušky. Stačí pro každého z 2.3 milionu uživatelů, na než jsem při crawlování narazil, vytvořit profil o jaké tagy se zajímá a příslušné profily pak zkombinovat pro každé album bez tagů. Je to jednoduché, rychlé a funguje to překvapivě dobře pro tagy obecných žánrů. Přesně to trefí 'punk' nebo death metal', ale ne 'isochronic tones' nebo 'vaporfunk', ale to úplně stačí.

Nejvíc cool by bylo prohnat tracky nějakou AI vychytávkou, co by je klasifikovala podle žánrů, ale skromně se domnívám, že kdybych začal ve velkém stahovat hudbu, velice rychle bych obdržel ban tak přísný, že by bandcamp na SYN nedopovídal SYN-ACK paketem, ale střelbou kanóny vágním směrem, kde tuší, že by se mohla nacházet česká republika.

---
k47 @k47 -- Dec 30, 2022 (0/1/2)

Podívejte na tu nádheru. Graf ukazuje kolik času https://k47.cz/bandcamp/ strávil v PHP kódu. Po poslední optimalizaci naprostá většina dotazů trvá méně než jednu milisekundu. Tedy aspoň většina jednoduchých dotazů, tedy těch, co se dotazují na první stránku alb nějakého tagu. Ta je plně materializovaná a pro její zobrazení stačí jeden dotaz do jedné hashtabulky na disku. Komplexní dotazy si musí sáhnout do jedné hashtabulky pro seznam idček a pak najít odpovídající alba v jiné hashtabulce. To znamená hodně náhodného IO, což je bývá pomalejší. Poslední kategorie jsou RSS dotazy (zeleně), které zobrazí 3x víc alb, než ty webové. Na jejich rychlosti záleží méně, protože nejsou interaktivní. Mimochodem tohle všechno běží na sdíleném webhostingu na serveru, kde běží celkem 500 webů.

bodový graf rychlosti odpovědí na webové požadavky, vypadá dost divoce, jako změť barevných teček, které dohromady vytvářejí geometrické obrazce znamenající jediné: úspěch
---
k47 @k47 -- Dec 28, 2022 (0/0/0)

Dnes večer k poslechu a tanci hraje: Morrow - The Quiet Earth (https://theplagueofman.bandcamp.com/album/the-quiet-earth-2) a Burden Limbs - It Can Never Be Satisfied (https://glasshouserecords.bandcamp.com/album/it-can-never-be-satisfied).

Více na https://k47.cz/hraje/

---
k47 @k47 -- Dec 27, 2022 (0/0/0)

Ležel jsem v posteli, přemýšlel o průniku invertovaných indexů (jak se stává, když člověk postrádá intimní život & nemůže myslet na někoho blízkého #lol), o tom, že kardinalita seznamů by šla použít pro nastavení výchozích parametrů hledání.

Mám takovouhle situaci:

N = 1e6

seznam A: nA = 100000, dA = N / nA = 0.1
seznam B: nB = 1000, dB = N / nB = 0.001

Kde v A hledat daný prvek z B? Co třeba j = Bi * dA?

Kdyby A bylo uniformní po celé délce, pak j je místo, kde bychom měli čekal Bi. Pokud tam není, udělám binární hledání doleva nebo doprava. Asi bych se snažil vždy trochu přestřelit, aby podmínka měla předvídatelný směr + hledání vlevo má omezený rozsah.

Tohle ale platí jen, když mají seznamy uniformní hustotu, což není vždy pravda, například v případě kdy idčka korelují s časem. V tom případě bych mohl nad seznamem postavit jednoduchý index, který obsahuje m segmentů o očekávané délce c. Každý segment pokrývá rozsah hodnot c / dA.

Rozsah hodnot segmentu je konstantní pro daný index, když uchovává pozice v seznamu, kde začínají položky s daným id, vyčtu z něho počet hodnot, z toho vypočítám lokální hustotu a tak i relativně přesné místo, kde začít hledat.

Dává to smysl?

---
Show older