2013-07-10 9 views
5

चूंकि कोई मामला असंवेदनशील string.Contains() नहीं है (फिर भी string.Equals() का मामला असंवेदनशील संस्करण मौजूद है जो मुझे परेशान करता है, लेकिन मैं digress) .NET में, क्या है का उपयोग कर RegEx.IsMatch() बनाम उपयोग के बीच प्रदर्शन अंतर?RegEx.IsMatch() बनाम स्ट्रिंग.ToUpper()।() प्रदर्शन शामिल है() प्रदर्शन

उदाहरण:

string testString = "tHiSISaSTRINGwiThInconSISteNTcaPITaLIZATion"; 

bool containsString = RegEx.IsMatch(testString, "string", RegexOptions.IgnoreCase); 
bool containsStringRegEx = testString.ToUpper().Contains("STRING"); 

मैं हमेशा सुना है कि string.ToUpper() एक बहुत ही महंगा कॉल तो मैं इसे का उपयोग जब मैं string.Contains() तुलना करना चाहते हैं से संकोच है, लेकिन कैसे RegEx.IsMatch() प्रदर्शन के मामले में की तुलना करता है?

क्या ऐसी तुलना करने के लिए कोई और अधिक कुशल दृष्टिकोण है?

string testString = "tHiSISaSTRINGwiThInconSISteNTcaPITaLIZATion"; 
bool contained = testString.IndexOf("string", StringComparison.OrdinalIgnoreCase) >= 0; 

आप एक संस्कृति के प्रति संवेदनशील तुलना की जरूरत है, CurrentCultureIgnoreCase बजाय OrdinalIgnoreCase का उपयोग करें:

+4

क्या आपने [स्टॉपवॉच] (http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx) का उपयोग करने का प्रयास किया है? – Sayse

+2

यह जानने का एकमात्र तरीका है कि कौन सा तेज़ है, उन्हें चलाने और उन्हें चलाने का एकमात्र तरीका है। इससे मदद मिल सकती है: http://stackoverflow.com/questions/457605/how-to-measure-code-performance-in-net – kevingessner

+3

'testString.IndexOf ("स्ट्रिंग", स्ट्रिंग कॉम्पर्सन। कंटेंटकल्चर इग्नोरकेस)> = 0' के बारे में क्या? –

उत्तर

16

यहाँ एक बेंचमार्क

using System; 
using System.Diagnostics; 
using System.Text.RegularExpressions; 

public class Program 
{ 
    public static void Main(string[] args) 
    { 
     Stopwatch sw = new Stopwatch(); 

     string testString = "tHiSISaSTRINGwiThInconSISteNTcaPITaLIZATion"; 

     sw.Start(); 
     var re = new Regex("string", RegexOptions.Compiled | RegexOptions.CultureInvariant | RegexOptions.IgnoreCase); 
     for (int i = 0; i < 1000000; i++) 
     { 
      bool containsString = re.IsMatch(testString); 
     } 
     sw.Stop(); 
     Console.WriteLine("RX: " + sw.ElapsedMilliseconds); 

     sw.Restart(); 
     for (int i = 0; i < 1000000; i++) 
     { 
      bool containsStringRegEx = testString.ToUpper().Contains("STRING"); 
     } 


     sw.Stop(); 
     Console.WriteLine("Contains: " + sw.ElapsedMilliseconds); 

     sw.Restart(); 
     for (int i = 0; i < 1000000; i++) 
     { 
      bool containsStringRegEx = testString.IndexOf("STRING", StringComparison.OrdinalIgnoreCase) >= 0 ; 
     } 


     sw.Stop(); 
     Console.WriteLine("IndexOf: " + sw.ElapsedMilliseconds); 
    } 
} 

परिणाम

indexOf (183ms)> संकलित Regex का उपयोग करके शामिल हैं (400 मि.से)> Regex (477ms)

(अपडेट किया गया उत्पादन बार थे है)

+1

परिणाम: RX: 3032 शामिल है: 385 indexOf: 97 (मोनो के तहत unoptimized निर्माण) (पी एस मैं Regex precompiled बनाया) – sehe

+0

@sehe - संपादित करें और डेटा के लिए धन्यवाद।। – keyboardP

+0

जिटर के बारे में क्या? – ata

0

मैं RegEx.match धीमा होने की उम्मीद करूंगा आम तौर पर नियमित अभिव्यक्ति पार्सर्स के साथ व्यक्तिगत अनुभव के आधार पर। लेकिन जैसा कि कई लोगों ने उल्लेख किया है, यह सुनिश्चित करने के लिए यह सुनिश्चित करने का सबसे अच्छा तरीका है। मुझे नियमित अभिव्यक्ति पार्सर्स से संबंधित प्रदर्शन समस्याओं को ठीक करना पड़ा है, toLower और toUpper कभी मुझे काटने के लिए वापस नहीं आए हैं।

संबंधित मुद्दे