Home Arrow Icon Knowledge base Arrow Icon Global Arrow Icon 在原始值上使用匹配器是否有任何性能的影响


在原始值上使用匹配器是否有任何性能的影响


在比较使用匹配器与原始值的性能含义时,取决于使用的上下文。这是一个详细的故障:

##一般编程

在编程中,匹配器经常用于测试框架(例如Mockito或Googletest)来做出断言或存根方法。使用匹配器时,匹配器必须提供所有参数,以避免诸如Mockito [5] [8]中的“ InvaliduseofMatchersexception”之类的错误。与直接使用原始值相比,由于其他功能调用,此要求可能会导致更多的开销。

但是,除非您要处理大量的电话或代码关键性段,否则性能差异通常可以忽略不计。在大多数情况下,匹配者提供的可读性和灵活性大于任何较小的性能成本。

##在查找和匹配操作中

在涉及查找操作的方案中,例如Rust的“ Match”表达式与查找表中,性能可能会根据几个因素而有所不同:

- 分支预测:如果分支预测效果很好,则可以更快地表达式,这意味着CPU可以准确预测下一个分支。但是,如果模式是随机的,则查找表可能会更快,因为它避免了分支预测失败[3] [6]。

- 内线和缓存:在正确地夹住和缓存时,查找表可以更快,尤其是对于较大的数据集时。但是,``匹配表达式''通常会产生更少的说明,并且除非插入微构造危害[3] [6],否则可能会更快。

##以正则表达式和模式匹配

当使用正则表达式(REGEX)进行模式匹配时,性能可能会受到正则复杂性和正在处理的数据的大小的重大影响。虽然Regex功能强大且灵活,但由于回溯和其他开销,过于复杂的模式会导致性能较慢[9]。

相反,使用原始值或更简单的匹配机制可能更快地进行比较,但缺乏正则表达式的灵活性和表现力。

##可观察性和数据系统

在处理高基数数据(例如日志,指标,痕迹)的系统中,使用匹配器或复杂查询可能会导致性能问题。高基数是指大量唯一值,它们可以压倒用于有效数据存储和检索的系统[1]。在这种情况下,优化查询或使用更有效的数据结构可以减轻性能的影响。

总而言之,尽管匹配者和复杂的匹配机制提供了灵活性和可读性,但与直接使用原始值相比,它们可以引入较小的性能开销。但是,除非在绩效至关重要的代码部分或处理非常大的数据集时,这些开销通常可以忽略不计。匹配器和原始值之间的选择应基于应用程序的特定要求,包括可读性,可维护性和性能需求。

引用:
[1] https://last9.io/blog/high-vs-low-cardinality/
[2] https://stats.stackexchange.com/questions/651015/use-smd-oraw-difference-in-proportions-when-comparance-balance-balance of-binary-covari
[3] https://users.rust-lang.org/t/why-is-a-a-bookup-table-faster-than-a-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-relic/extracting-log-data-with-regex
[10] http://google.github.io/googletest/reference/matchers.html