Bohuzel ta Rusti knihovna je plna unsafe kodu, takze nevidim moc vyhod oproti bindingum odzkousene zlib-ng nebo potencialne vykonejsi libdeflate.
Unsafe je skoro to všude i mimo C API. Jednak se tam používá C-style práce s pamětí. Např.
// zero initialize the memory
let prev = prev.as_ptr(); // FIXME: write_bytes is stable for NonNull since 1.80.0
unsafe { prev.write_bytes(0, w_size) };
let prev = unsafe { WeakSliceMut::from_raw_parts_mut(prev, w_size) };
A druhá věc je, že se tam používají SIMD instrukce jako např. AVX 2, které Rust neumí volat v safe kódu. Takže pak ty výkonné implementace jsou v podstatě celé jenom unsafe kód. Viz třeba adler.rs
Z tohoto + z README mi přijde, že autor vzal kód zlib-ng a snažil se jej ± 1:1 přepsat do Rustu. A kde to nešlo přímočaře vyřešit bez toho, použil unsafe. A co z toho plyne?
1. Dobré vědět, na čem jsme.
2. V zásadě by to nemuselo být horší než předloha.
3. Pokud se tomu bude věnovat dál, snad ty unsafe věci zredukuje nebo nějak rozumně zawrapuje. Možná během toho najde i chyby v původní implementaci.
Ad SIMD – to je jen otázka rozumného wrapperu, který bude unsafe, ale půjde rozumně zkontrolovat.
>>> Rusti knihovna je plna unsafe kodu,
To je fuzzy termín, dajte nejaké metriky, že koľko, čo a ako. Vážne ma zaujíma pohľad experta. Ak je unsafe kód dobre vyčlenený a testovateľný, tak to nebude big deal. Ak je to prelezené ako rakovinou, potom je to horšie, asi tak na úrvni C, len rýchlejšie. Tak ako?
27. 2. 2025, 15:11 editováno autorem komentáře
Osobne by som povedal, že oboje. Momentálne som v rust začiatočník a môj kód je diplomaticky povedané - nie najlepší. Ale beží to ako namydlený blesk. Ak knižnica používa paralelizmus, v C sa všetko musí nemotorne oprogramúvať, v Rust je to transparenté. Robím to cez Rayon a ten musí mať nejaké triky pod kapotou, nejak tie thready múdrejšie manažuje, než by som to robil sám. A aj v ostaných veciach asi bude dôvod, prečo je tá kompilácia tak strašne pomalá (robí to asi viac, než -O3 v gcc). Mám asi tušenie, že čo, len nechcem trepať, budú o tom lepšie materiály niekde.
Nelze generalizovat.
Je nutno si uvědomit, že binding v Rustu znamená, že celou tu C knihovnu narvu do unsafe, takže jsem si vlastně nepomohl.
U bindingu mám výhodu kódu ověřeným časem. V případě, že nemám v plánu nějak optimalizovat a vrtat se v tom, to bude naprosto dostačující.
U reimplementace mám výhodu, že se můžu opřít o Rust, a nebezpečný kód minimalizuji na čitelnou úroveň. Nevýhoda je v tom, že je to práce, která se musí udělat a vyplatit. Taky jako u každého nového kódu tam můžu nasekat nové chyby.
Pokud jsem příspěvek pochopil dobře, tak autoři si věřili, že se ten kód dá optimalizovat, a chtěli se pochlubit úspěchem.
Tedy důvod, proč zvolit zlib-rs je rychlost. Není důvod si myslet, že by bezpečnost byla nějak výrazně různá.