Home Arrow Icon Knowledge base Arrow Icon Global Arrow Icon Ci sono implicazioni prestazionali dell'utilizzo di accompagnatori rispetto ai valori grezzi


Ci sono implicazioni prestazionali dell'utilizzo di accompagnatori rispetto ai valori grezzi


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