При сравнении последствий производительности использования совпадений и необработанных значений вступают в игру несколько факторов, в зависимости от контекста, в котором они используются. Вот подробный срыв:
в общем программировании
При программировании совпадения часто используются в рамках тестирования, таких как Mockito или Googletest, чтобы сделать утверждения или методы заглушки. При использовании совпадений все аргументы должны быть предоставлены маттерами, чтобы избежать ошибок, таких как `envaliduseofMatchersException` в Mockito [5] [8]. Это требование может привести к немного большему количеству накладных расходов из -за дополнительных вызовов функций по сравнению с непосредственным использованием необработанных значений.
Тем не менее, разница в производительности обычно незначительна, если вы не имеете дело с очень большим количеством вызовов или в критических разделах кода. В большинстве случаев читаемость и гибкость, предоставленные маттерами, перевешивают любые незначительные затраты на производительность.
в поисках и соответствующих операциях
В сценариях, включающих операции по поиску, например, в таблицах «Матч» Руста и таблицах поиска, производительность может варьироваться в зависимости от нескольких факторов:
- Прогнозирование филиала: «Матч» выражения могут быть быстрее, если прогнозирование филиала работает хорошо, что означает, что ЦП может точно предсказать, какая ветвь будет принята дальше. Однако, если шаблон является случайным, таблица поиска может быть быстрее, поскольку она позволяет избежать сбоев прогнозирования ветви [3] [6].
- Внедрение и кеш: таблицы поиска могут быть быстрее, когда вставлены и кэшируются должным образом, особенно для более крупных наборов данных. Тем не менее, «матча», как правило, генерируют меньше инструкций и могут быть быстрее, если не приводятся к принуждению к микроархитектурным опасностям [3] [6].
в регулярных выражениях и сопоставлении рисунков
При использовании регулярных выражений (Regex) для сопоставления рисунков на производительность может быть значительно повлиять сложность регуляции и размер обрабатываемых данных. В то время как регуляция является мощной и гибкой, чрезмерно сложные узоры могут привести к более медленной производительности из -за возврата и других накладных расходов [9].
Напротив, использование необработанных значений или более простых механизмов сопоставления может быть быстрее для простых сравнений, но им не хватает гибкости и выразительности корпорации.
в системах наблюдения и данных
В системах, касающихся данных высокой кардинальности (например, журналов, метрик, трассов), с использованием совпадений или сложных запросов может привести к проблемам с производительностью. Высокая кардинальность относится к большому количеству уникальных значений, которые могут перегружать системы, предназначенные для эффективного хранения и поиска данных [1]. В таких случаях оптимизация запросов или использование более эффективных структур данных может снизить воздействие на производительность.
Таким образом, в то время как совместные и сложные механизмы сопоставления предлагают гибкость и читаемость, они могут ввести небольшие накладные расходы на производительность по сравнению с непосредственным использованием необработанных значений. Тем не менее, эти накладные расходы обычно незначительны, если только в разделах кода, критически важными, или при работе с очень большими наборами данных. Выбор между маттерами и необработанными значениями должен основываться на конкретных требованиях приложения, включая читабельность, обслуживание и потребности в производительности.
Цитаты:[1] https://last9.io/blog/high-vs-low-cardinality/
[2] https://stats.stackexchange.com/questions/651015/use-smd-or-raw-difference-in-proportions-when-compling-balance-furange-covari
[3] https://users.rust-lang.org/t/why-is-a-lookup-table-faster-tan-a-match-expression/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-reelic/extracting-log-data-with-regex
[10] http://google.github.io/googletest/reference/matchers.html