C#正则表达式中d
效率低于[0-9]
:探究性能差异
最近一次性能比较意外地发现,在C#正则表达式引擎中,d
字符类比[0-9]
范围指定符的效率低。通常情况下,范围指定符的效率应该高于字符集。此外,即使与更冗长的[0123456789]
字符集相比,d
也表现出性能劣势。
为了解释这个令人惊讶的结果,让我们深入探讨一些可能的原因:
1. Unicode数字识别:
d
表示所有Unicode数字,而不仅仅是[0-9]
中指定的10个字符。Unicode包含来自各种语言的其他数字字符,例如波斯数字(۱۲۳۴۵۶۷۸۹)。这种更广泛的范围可能会引入额外的计算开销,从而降低d
的效率。
为了说明这个概念,我们可以使用以下代码生成所有Unicode数字的列表:
StringBuilder sb = new StringBuilder(); for (UInt16 i = 0; i < 0x10FFFF; i++) { if (char.IsDigit((char)i)) { sb.Append((char)i); } } string allUnicodeDigits = sb.ToString();
这将生成一个包含以下字符(以及其他字符)的长字符串:
٠١٢٣٤٥٦٧٨٩۰۱۲۳۴۵۶۷۸۹߀߁߂߃߄߅߆߇߈߉०१२३४५६७८९০১২৩৪৫৬৭৮৯੦੧੨੩੪੫੬੭੮੯૦૧૨૩૪૫૬૭૮૯
2. 实现差异:
正则表达式引擎可能以不同的方式实现d
和[0-9]
,这可能会导致性能差异。C#正则表达式引擎可能会专门优化[0-9]
以提高效率,而d
的更广泛范围可能会限制此类优化。
结论:
虽然最初令人惊讶,但d
的性能较慢可以归因于其对Unicode数字的扩展识别。当使用有限的数字集(例如0-9)时,[0-9]
或[0123456789]
可以提供更好的效率。但是,如果您需要匹配来自不同语言的更广泛的数字字符范围,d
仍然是一个强大的工具。
以上是为什么在C#Regex中的效率不如[0-9]'\ d`效率不高?的详细内容。更多信息请关注PHP中文网其他相关文章!