C#正則表達式中d
效率低於[0-9]
:探究性能差異
最近一次性能比較意外地發現,在C#正則表達式引擎中,d
字符類比[0-9]
範圍指定符的效率低。通常情況下,範圍指定符的效率應該高於字符集。此外,即使與更冗長的[0123456789]
字符集相比,d
也表現出性能劣勢。
為了解釋這個令人驚訝的結果,讓我們深入探討一些可能的原因:
1. Unicode數字識別:
d
表示所有Unicode數字,而不僅僅是[0-9]
中指定的10個字符。 Unicode包含來自各種語言的其他數字字符,例如波斯數字(۱۲۳۴۵۶۷۸۹)。這種更廣泛的範圍可能會引入額外的計算開銷,從而降低d
的效率。
為了說明這個概念,我們可以使用以下代碼生成所有Unicode數字的列表:
<code class="language-csharp">StringBuilder sb = new StringBuilder(); for (UInt16 i = 0; i < 0x10FFFF; i++) { if (char.IsDigit((char)i)) { sb.Append((char)i); } } string allUnicodeDigits = sb.ToString();</code>
這將生成一個包含以下字符(以及其他字符)的長字符串:
٠١٢٣٤٥٦٧٨٩۰۱۲۳۴۵۶۷۸۹߀߁߂߃߄߅߆߇߈߉०१२३४५६७८९০১২৩৪৫৬৭৮৯੦੧੨੩੪੫੬੭੮੯૦૧૨૩૪૫૬૭૮૯
2. 實現差異:
正則表達式引擎可能以不同的方式實現d
和[0-9]
,這可能會導致性能差異。 C#正則表達式引擎可能會專門優化[0-9]
以提高效率,而d
的更廣泛範圍可能會限制此類優化。
結論:
雖然最初令人驚訝,但d
的性能較慢可以歸因於其對Unicode數字的擴展識別。當使用有限的數字集(例如0-9)時,[0-9]
或[0123456789]
可以提供更好的效率。但是,如果您需要匹配來自不同語言的更廣泛的數字字符範圍,d
仍然是一個強大的工具。
以上是為什麼在C#Regex中的效率不如[0-9]'\ d`效率不高?的詳細內容。更多資訊請關注PHP中文網其他相關文章!