Quando si confrontano le implicazioni delle prestazioni dell'utilizzo dei matcher rispetto ai valori grezzi, vengono in gioco diversi fattori, a seconda del contesto in cui vengono utilizzati. Ecco una rottura dettagliata:
in programmazione generale
Nella programmazione, i matcher sono spesso utilizzati in framework di test come Mockito o Googletest per fare affermazioni o metodi di stub. Quando si utilizzano i matcher, tutti gli argomenti devono essere forniti dai matcher per evitare errori come `invaliduseofmatchersException` in mockito [5] [8]. Questo requisito può portare a un overhead leggermente più a causa delle chiamate di funzione aggiuntive rispetto all'utilizzo diretto di valori grezzi.
Tuttavia, la differenza di prestazione è in genere trascurabile a meno che tu non abbia a che fare con un numero molto elevato di chiamate o in sezioni di codice critica delle prestazioni. Nella maggior parte dei casi, la leggibilità e la flessibilità fornite dai matcher superano eventuali costi di prestazione minori.
nelle operazioni di ricerca e corrispondenza
Negli scenari che coinvolgono operazioni di ricerca, come nelle espressioni `match` di Rust rispetto alle tabelle di ricerca, le prestazioni possono variare in base a diversi fattori:
- Previsione del ramo: le espressioni `Match` possono essere più veloci se la previsione del ramo funziona bene, il che significa che la CPU può prevedere accuratamente quale ramo verrà preso in seguito. Tuttavia, se il modello è casuale, una tabella di ricerca potrebbe essere più veloce perché evita i guasti alla previsione del ramo [3] [6].
- Inlining e cache: le tabelle di ricerca possono essere più veloci se inserite e memorizzate nella cache correttamente, specialmente per set di dati più grandi. Tuttavia, le espressioni `Match` generalmente generano meno istruzioni e possono essere più veloci a meno che non in linea non causi rischi microarchitettetti [3] [6].
nelle espressioni regolari e nella corrispondenza del modello
Quando si utilizzano espressioni regolari (Regex) per la corrispondenza dei pattern, le prestazioni possono essere significativamente influenzate dalla complessità del regex e dalle dimensioni dei dati da elaborare. Mentre Regex è potente e flessibile, i motivi troppo complessi possono portare a prestazioni più lente a causa del backtracking e di altri sovraccarichi [9].
Al contrario, l'uso di valori grezzi o meccanismi di abbinamento più semplici potrebbero essere più veloci per confronti semplici ma manca di flessibilità e espressività di Regex.
nei sistemi di osservabilità e dati
Nei sistemi che si occupano di dati di cardinalità elevata (ad es. Registri, metriche, tracce), l'utilizzo di matcher o query complesse può portare a problemi di prestazioni. L'alta cardinalità si riferisce a un gran numero di valori unici, che possono sopraffare i sistemi progettati per un'archiviazione e un recupero efficienti di dati [1]. In tali casi, l'ottimizzazione di query o l'utilizzo di strutture di dati più efficienti può mitigare gli impatti delle prestazioni.
In sintesi, mentre i matcher e i meccanismi di abbinamento complessi offrono flessibilità e leggibilità, possono introdurre le spese generali di prestazioni minori rispetto all'utilizzo diretto di valori grezzi. Tuttavia, queste spese generali sono generalmente trascurabili a meno che nelle sezioni di codice critico per le prestazioni o quando si tratta di set di dati molto grandi. La scelta tra accompagnatori e valori grezzi dovrebbe essere basata sui requisiti specifici dell'applicazione, tra cui leggibilità, manutenibilità e esigenze di prestazione.
Citazioni:[1] https://last9.io/blog/high-vs-low-cardinality/
[2] https://stats.stackexchange.com/questions/651015/use-smd-or-raw-diffference --in-proportions-when-comparing-balance-of-bary-covari
[3] https://users.rust-lang.org/t/why-is-a-lookup-table-faster-than-a-match-espression/24233
[4] https://docs.splunk.com/documentation/scs/current/searchreference/conditionalfunctions
[5] https://zsoltfabok.com/blog/2010/08/jmock-versus-mockito/
[6] https://kevinlynagh.com/notes/match-vs-lookup/
[7] https://docs.vespa.ai/en/reference/schema-reference.html
[8] https://www.digitalocean.com/community/tutorials/mockito-argument-matchers-any-eq
[9] https://newrelic.com/blog/how-to-relic/extrating-log-data-with-regex
[10] http://google.github.io/googlest/reference/matchers.html