Home Arrow Icon Knowledge base Arrow Icon Global Arrow Icon Czy istnieją jakiekolwiek konsekwencje wydajności stosowania dopasowań nad wartościami surowymi


Czy istnieją jakiekolwiek konsekwencje wydajności stosowania dopasowań nad wartościami surowymi


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