To by me zajimalo, protoze to asi je docela mozny :) Ten prekladac Go skutecne neni uplne to nejlepsi, co ve svete prekladacu vzniklo. Samozrejme Go bez problemu valcule jakykoli interpret, ale proste LLVM optimalizace nekdy chybi (zase na druhou stranu dokaze optimalizovat i na urovni linkeru, to je tusim mozna ne unikatni, ale ne zcela bezne).
To je ošemetné, v reálných aplikacích, kde jsem dělal benchmarky, jsem většinou zjistil, že pomalost (částí) kódu nebývá často způsobená přímo kódem, ale něčím "externím". Třeba Rust se standardním alokátorem je šnek, ale člověk tam dá Mimalloc a najednou všechny válcuje. Go má alokátor optimalizovaný pro více vláken, takže test v rámci jednoho vlákna taky nedopadne oslnivě. Kromě alokátoru se často projeví runtime, třeba traity v Rustu jsou poměrně pomalé (dispatch na nich) a std::Any je úplně napikaču, kdežto typový switch v Go (a vůbec jeho typový runtime s asercemi apod.) je rychlý. Jó, kdybychom měli kód bez dynamické alokace paměti a bez dynamického dispatche, tak cokoliv založené na LLVM s přehledem vyhraje co do rychlosti (Rust, Julia), ale většina programů drhne jinde. (Na kód bez dynamické alokace paměti a bez dynamického dispatche ale zase stačí bohatě C).
@Pavel Tišnovský
“To by me zajimalo, protoze to asi je docela mozny :)”
https://hmarr.com/blog/go-allocation-hunting/
8. 12. 2022, 15:51 editováno autorem komentáře
Tady je ten článek: https://medium.com/@muroon/the-reason-why-zap-and-zerolog-make-it-zero-allocation-3ee8f69f660?source=user_profile---------0----------------------------
V kontextu článku zajímavé je, že nová knihovna pro strukturované logování slog která míří do standardní knihovny (momentálně v balíčku experimental) vytváří nové struktury typu Record takto:
func NewRecord(t time.Time, level Level, msg string, calldepth int, ctx context.Context) Record { // ... return Record{ Time: t, Message: msg, Level: level, Context: ctx, } }
Tady si nejsem jistý, jak to vlastně dopadne, není ukazatel takže teoreticky to kompilátor může ponechat na zásobníku i jako návratovou hodnotu ne? Samozřejmě kromě řetězce což je odkaz na heap.
Mimochodem, ja jaře 2023 má vyjít 1.20 s multi error wrappingem, námět na článek :-) https://lukas.zapletalovi.com/posts/2022/wrapping-multiple-errors/