Při porovnání výkonnostních důsledků používání zápasů versus nezpracovaným hodnotám se do hry přivedou několik faktorů v závislosti na kontextu, ve kterém jsou použity. Zde je podrobné zhroucení:
V obecném programování
Při programování se zápasů často používají při testování rámců, jako je Mockito nebo GoogleTest, aby vytvořili tvrzení nebo metody strnu. Při používání zápasů musí být všechny argumenty poskytnuty Matchers, aby se zabránilo chybám, jako je „InvaliduseofMatcherSexception“ v Mockito [5] [8]. Tento požadavek může vést k o něco více režijních nákladů v důsledku dalších funkčních volání ve srovnání s přímým používáním surových hodnot.
Rozdíl výkonu je však obvykle zanedbatelný, pokud se nezabýváte velmi velkým počtem hovorů nebo v kritických částech kódu. Ve většině případů čitelnost a flexibilita poskytnutá Matchers převažuje nad malými náklady na výkon.
V operacích vyhledávání a odpovídajících
Ve scénářích týkajících se vyhledávacích operací, například v Rust's „Match“ výrazy versus vyhledávací tabulky, se výkon může lišit v závislosti na několika faktorech:
- Predikce pobočky: „Match“ výrazy mohou být rychlejší, pokud predikce větve funguje dobře, což znamená, že CPU může přesně předpovědět, která větev bude přijata dál. Pokud je však vzorec náhodný, může být vyhledávací tabulka rychlejší, protože se vyhýbá poruchám předpovědi větve [3] [6].
- Inlining a mezipaměť: Vyhledávací tabulky mohou být rychlejší, když jsou vloženy a správně ukládány do mezipaměti, zejména pro větší datové sady. „Match“ výrazy však obecně vytvářejí méně pokynů a mohou být rychlejší, pokud inlining nezpůsobí mikroarchitekturní nebezpečí [3] [6].
v regulárních výrazy a porovnávání vzorů
Při použití regulárních výrazů (regex) pro porovnávání vzorů může být výkon výrazně ovlivněn složitostí regexu a velikostí zpracovaných dat. Zatímco Regex je silný a flexibilní, příliš složité vzory mohou vést k pomalejšímu výkonu kvůli zpětnému sledování a jiným režijním nákladům [9].
Naproti tomu použití surových hodnot nebo jednodušších mechanismů porovnávání může být pro přímé srovnání rychlejší, ale postrádá flexibilitu a expresivitu regexu.
V pozorovatelnosti a datových systémech
V systémech zabývajících se údaji o vysoké kardinálnosti (např. Protokoly, metriky, stopy), pomocí pohodlajících nebo složitých dotazů mohou vést k problémům s výkonem. Vysoká kardinálnost se týká velkého počtu jedinečných hodnot, které mohou přemoci systémy určené pro efektivní ukládání a vyhledávání dat [1]. V takových případech může optimalizace dotazů nebo použití účinnějších datových struktur zmírnit dopady výkonu.
Stručně řečeno, zatímco Matchers a Complex pro porovnávání nabízejí flexibilitu a čitelnost, mohou zavést menší režijní náklady ve srovnání s přímým používáním hodnot RAW. Tyto režijní náklady jsou však obvykle zanedbatelné, pokud v sekcích kritických kódů nebo při jednání s velmi velkými datovými sadami. Volba mezi zápasů a hodnotami RAW by měla být založena na specifických požadavcích aplikace, včetně potřeby čitelnosti, udržovatelnosti a výkonu.
Citace:[1] https://last9.io/blog/high-vs-low-cardinality/
[2] https://stats.stackexchange.com/questions/651015/use-smd-raw-difference-in-proportions-When-Comparing-Balance-of-Binary-covari
[3] https://users.rust-lang.org/t/why-is-a-bookup-table-frafter-than-a-maatch-expression/24233
[4] https://docs.splunk.com/documentation/scs/current/searchreference/conditionalfunctions
[5] https://zsoltfabok.com/blog/2010/08/jmock-vers-mockito/
[6] https://kevinlynagh.com/notes/match-vs-okup/
[7] https://docs.vespa.ai/en/reference/schema-reference.html
[8] https://www.digitalocean.com/community/tutorials/mockito-argument-machers-any-eq
[9] https://newrelic.com/blog/how-to-relic/extracting-log-data-with-regex
[10] http://google.github.io/googletest/reference/matchers.html