Porównując implikacje wydajności stosowania dopasowawców w porównaniu z surowymi wartościami, wchodzi kilka czynników, w zależności od kontekstu, w którym są używane. Oto szczegółowy podział:
w programowaniu ogólnym
W programowaniu dopasowania są często używane w ramach testowania, takich jak Mockito lub Googletest, aby stworzyć twierdzenia lub metody SUP. Podczas korzystania z mecherów wszystkie argumenty muszą być dostarczane przez mechery, aby uniknąć błędów, takich jak „InvaliIduseOfMatchersException” w Mockito [5] [8]. Ten wymóg może prowadzić do nieco więcej kosztów ogólnych ze względu na dodatkowe wywołania funkcji w porównaniu z bezpośrednim używaniem wartości surowych.
Różnica wydajności jest jednak zazwyczaj nieistotna, chyba że masz do czynienia z bardzo dużą liczbą połączeń lub w krytycznych sekcjach kodu. W większości przypadków czytelność i elastyczność zapewniana przez dopasowawców przewyższają wszelkie niewielkie koszty wydajności.
w operacjach wyszukiwania i dopasowania
W scenariuszach obejmujących operacje wyszukiwania, takie jak wyrażenia Rust `` Match 'w porównaniu z tabelami wyszukiwania, wydajność może się różnić w zależności od kilku czynników:
- Prognozowanie gałęzi: „Wyrażenia dopasowania” mogą być szybsze, jeśli prognoza gałęzi działa dobrze, co oznacza, że procesor może dokładnie przewidzieć, która gałąź zostanie pobrana w następnej kolejności. Jeśli jednak wzór jest losowy, tabela wyszukiwania może być szybsza, ponieważ pozwala uniknąć awarii prognozowania gałęzi [3] [6].
- Inlinowanie i pamięć podręczna: Tabele wyszukiwania mogą być szybsze po prawidłowym i prawidłowym buforowaniu, szczególnie w przypadku większych zestawów danych. Jednak wyrażenia „dopasowania” generalnie generują mniej instrukcji i mogą być szybsze, chyba że przyczyny powoduje zagrożenia mikroarchitektoniczne [3] [6].
w wyrażeniach regularnych i dopasowaniu wzorów
Podczas korzystania z wyrażeń regularnych (Regex) do dopasowywania wzorców na wydajność może mieć znaczący wpływ na złożoność regularności i rozmiar przetwarzanych danych. Podczas gdy Regex jest potężny i elastyczny, zbyt złożone wzory mogą prowadzić do wolniejszej wydajności z powodu wycofania się i innych kosztów ogólnych [9].
Natomiast stosowanie surowych wartości lub prostszych mechanizmów dopasowywania może być szybsze w przypadku prostych porównań, ale brakuje elastyczności i ekspresji regularności.
w systemach obserwowalności i danych
W systemach dotyczących wysokich danych kartynowościowych (np. Dzienniki, wskaźniki, ślady), używanie dopasowań lub złożonych zapytań może prowadzić do problemów z wydajnością. Wysoka kartynalność odnosi się do dużej liczby unikalnych wartości, które mogą przytłoczyć systemy zaprojektowane do wydajnego przechowywania i pobierania danych [1]. W takich przypadkach optymalizacja zapytań lub korzystanie z bardziej wydajnych struktur danych może złagodzić wpływ wydajności.
Podsumowując, podczas gdy dopasowawcy i złożone mechanizmy dopasowywania oferują elastyczność i czytelność, mogą wprowadzać niewielkie koszty wydajności w porównaniu z bezpośrednim stosowaniem surowych wartości. Jednak te koszty ogólne są zwykle nieistotne, chyba że w sekcjach krytycznych w zakresie krytycznych wydajności lub w przypadku bardzo dużych zestawów danych. Wybór między dopasowawcami a wartościami surowymi powinien opierać się na konkretnych wymaganiach aplikacji, w tym czytelności, możliwości utrzymania i potrzebach wydajności.
Cytaty:[1] https://last9.io/blog/high-vs-low-cardinality/
[2] https://stats.stackexchange.com/questions/651015/use-smd-or-raw-difference-in-proportions-hen-comparing-balance-of-binary-covari
[3] https://users.rust-lang.org/t/why-is-a-lookup-table-faster-than-a-match-expression/24233
[4] https://docs.splunk.com/documentation/scs/current/searchreference/conditionalFunctions
[5] https://zsoltfabok.com/blog/2010/08/jmock-versus-mocchito/
[6] https://kevinlynagh.com/notes/match-vs-lookup/
[7] https://docs.vespa.ai/en/reference/schema-reference.html
[8] https://www.digitallocean.com/community/tutorials/mockito-argument-matchers-any-eq
[9] https://newrelic.com/blog/how-to-relic/extracting-log-data-with-regex
[10] http://google.github.io/googletest/reference/matchers.html