ILSpy दिखाता है कि String.IsNullOrEmpty
String.Length
के संदर्भ में लागू किया गया है। लेकिन फिर String.IsNullOrEmpty(s)
s.Length == 0
से तेज़ क्यों है? ।।String.IsNullOrEmpty स्ट्रिंग की तुलना में तेज़ क्यों है। लम्बाई?
var stopwatches = Enumerable.Range(0, 4).Select(_ => new Stopwatch()).ToArray();
var strings = "A,B,,C,DE,F,,G,H,,,,I,J,,K,L,MN,OP,Q,R,STU,V,W,X,Y,Z,".Split(',');
var testers = new Func<string, bool>[] { s => s == String.Empty, s => s.Length == 0, s => String.IsNullOrEmpty(s), s => s == "" };
int count = 0;
for (int i = 0; i < 10000; ++i) {
stopwatches[i % 4].Start();
for (int j = 0; j < 1000; ++j)
count += strings.Count(testers[i % 4]);
stopwatches[i % 4].Stop();
}
(अन्य मानक के रूप में एक अलग रूप में, इसी तरह के परिणाम यह एक अपने कंप्यूटर पर चल रहे cruft के प्रभाव को कम से कम दिखाने के अलावा, परीक्षण की तुलना:
उदाहरण के लिए, यह 5% इस बेंचमार्क में तेज है करने के लिए रिक्त स्ट्रिंग IsNullOrEmpty
की तुलना में धीमी 13% के बारे में एक ही बाहर आया था।)
साथ ही, क्यों IsNullOrEmpty
केवल तेजी से 86 पर है, जबकि 64 पर String.Length
लगभग 9% तेज है?
अद्यतन: टेस्ट सेटअप विवरण: 64-बिट विंडोज 7 पर चल रहे .NET 4.0, इंटेल कोर i5 प्रोसेसर, कंसोल प्रोजेक्ट "अनुकूलित कोड" सक्षम के साथ संकलित। हालांकि, "मॉड्यूल लोड पर जेआईटी अनुकूलन को दबाएं" भी सक्षम किया गया था (स्वीकृत उत्तर और टिप्पणियां देखें)।
अनुकूलन के साथ पूरी तरह से सक्षम, Length
, के बारे में 14% प्रतिनिधि और अन्य भूमि के ऊपर से हटाया साथ IsNullOrEmpty
की तुलना में तेजी है इस परीक्षण में के रूप में:
var strings = "A,B,,C,DE,F,,G,H,,,,I,J,,K,L,MN,OP,Q,R,,STU,V,,W,,X,,,Y,,Z,".Split(',');
int count = 0;
for (uint i = 0; i < 100000000; ++i)
count += strings[i % 32].Length == 0 ? 1 : 0; // Replace Length test with String.IsNullOrEmpty
आप जिस सटीक परिस्थिति में हैं, उसे जानने के बिना, मुझे पूरा भरोसा है कि ज्यादातर परिस्थितियों में यह जांचने के लिए सबसे तेज़ तरीका है कि स्ट्रिंग में कोई डेटा नहीं है या नहीं। – Andrew
@minitech क्योंकि 4 परीक्षक हैं, और वह उन्हें स्वतंत्र रूप से समय दे रहा है। –
'खाली' और '==' 'लंबाई' और' IsNullOrEmpty' के साथ तुलना कैसे करें? –