मैंने कल एक जवाब पर एक टिप्पणी की, जहां किसी ने या के बजाय [0123456789]
एक नियमित अभिव्यक्ति में उपयोग किया था । मैंने कहा कि एक चरित्र सेट की तुलना में सीमा या अंक विनिर्देशक का उपयोग करना संभवतः अधिक कुशल था।[0-9]
\d
मैंने आज उस परीक्षण का निर्णय लिया और मेरे आश्चर्य का पता चला कि (C # regex इंजन में कम से कम) \d
अन्य दो की तुलना में कम कुशल प्रतीत होता है जो कि अधिक भिन्न नहीं लगते हैं। यहां मेरे परीक्षण का उत्पादन 1000 से अधिक यादृच्छिक वर्णों के साथ 50 यादृच्छिक वर्णों का 5077 है जिसमें वास्तव में एक अंक है:
Regular expression \d took 00:00:00.2141226 result: 5077/10000
Regular expression [0-9] took 00:00:00.1357972 result: 5077/10000 63.42 % of first
Regular expression [0123456789] took 00:00:00.1388997 result: 5077/10000 64.87 % of first
यह दो कारणों से मेरे लिए आश्चर्य की बात है:
- मुझे लगता है कि सीमा को सेट की तुलना में अधिक कुशलता से लागू किया जाएगा।
- मैं समझ नहीं पा रहा हूं कि
\d
इससे भी बदतर क्यों है[0-9]
। वहाँ के लिए\d
बस आशुलिपि की तुलना में अधिक है[0-9]
?
यहाँ परीक्षण कोड है:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
using System.Text.RegularExpressions;
namespace SO_RegexPerformance
{
class Program
{
static void Main(string[] args)
{
var rand = new Random(1234);
var strings = new List<string>();
//10K random strings
for (var i = 0; i < 10000; i++)
{
//Generate random string
var sb = new StringBuilder();
for (var c = 0; c < 1000; c++)
{
//Add a-z randomly
sb.Append((char)('a' + rand.Next(26)));
}
//In roughly 50% of them, put a digit
if (rand.Next(2) == 0)
{
//Replace one character with a digit, 0-9
sb[rand.Next(sb.Length)] = (char)('0' + rand.Next(10));
}
strings.Add(sb.ToString());
}
var baseTime = testPerfomance(strings, @"\d");
Console.WriteLine();
var testTime = testPerfomance(strings, "[0-9]");
Console.WriteLine(" {0:P2} of first", testTime.TotalMilliseconds / baseTime.TotalMilliseconds);
testTime = testPerfomance(strings, "[0123456789]");
Console.WriteLine(" {0:P2} of first", testTime.TotalMilliseconds / baseTime.TotalMilliseconds);
}
private static TimeSpan testPerfomance(List<string> strings, string regex)
{
var sw = new Stopwatch();
int successes = 0;
var rex = new Regex(regex);
sw.Start();
foreach (var str in strings)
{
if (rex.Match(str).Success)
{
successes++;
}
}
sw.Stop();
Console.Write("Regex {0,-12} took {1} result: {2}/{3}", regex, sw.Elapsed, successes, strings.Count);
return sw.Elapsed;
}
}
}
\d
अलग-अलग भाषाओं में इसका मतलब एक ही नहीं है। उदाहरण के लिए जावा में, \d
वास्तव में केवल 0-9 से मेल खाता है
\d
स्थानों से संबंधित है। Eg हिब्रू अंकों के लिए अक्षरों का उपयोग करता है।