क्या किसी को पता है क्यों सी # (.NET) का StartsWith फ़ंक्शन IsPrefix से काफी धीमा है?सी # में Startswith की तुलना में फ़ंक्शन isprefix तेज क्यों है?
उत्तर
मुझे लगता है कि यह ज्यादातर धागा की मौजूदा संस्कृति को लाते समय है।
आप String.StartsWith
के लिए इस प्रपत्र का उपयोग करने के मार्क के परीक्षण को बदलते हैं:
Stopwatch watch = Stopwatch.StartNew();
CultureInfo cc = CultureInfo.CurrentCulture;
for (int i = 0; i < LOOP; i++)
{
if (s1.StartsWith(s2, false, cc)) chk++;
}
watch.Stop();
Console.WriteLine(watch.ElapsedMilliseconds + "ms; chk: " + chk);
यह एक बहुत करीब आता है।
यदि आप s1.StartsWith(s2, StringComparison.Ordinal)
का उपयोग करते हैं तो यह CompareInfo.IsPrefix
का उपयोग करने से बहुत तेज़ है (निश्चित रूप से CompareInfo
के आधार पर)। मेरी बॉक्स पर परिणाम (वैज्ञानिक रूप से नहीं) कर रहे हैं:
- s1.StartsWith (s2): 6914ms
- s1.StartsWith (s2, झूठे, संस्कृति): 5568ms
- compare.IsPrefix (S1, S2): 5200ms
- s1.StartsWith (s2, StringComparison.Ordinal): 1393ms
जाहिर है कि क्योंकि यह वास्तव में सिर्फ प्रत्येक बिंदु है, जो बहुत सस्ता है कम 16 बिट पूर्णांकों की तुलना रहा है। यदि आप संस्कृति-संवेदनशील जांच चाहते हैं, और प्रदर्शन आपके लिए विशेष रूप से महत्वपूर्ण है, तो मैं अधिभार का उपयोग करता हूं।
स्टार्ट्स आंतरिक रूप से IsPrefix को कॉल करता है। यह IsPrefix को कॉल करने से पहले संस्कृति की जानकारी असाइन करता है।
अच्छा सवाल; एक परीक्षण के लिए, मैं मिलता है:
9156ms; chk: 50000000
6887ms; chk: 50000000
टेस्ट रिग:
using System;
using System.Diagnostics;
using System.Globalization;
class Program
{
static void Main()
{
string s1 = "abcdefghijklmnopqrstuvwxyz", s2 = "abcdefg";
const int LOOP = 50000000;
int chk = 0;
Stopwatch watch = Stopwatch.StartNew();
for (int i = 0; i < LOOP; i++)
{
if (s1.StartsWith(s2)) chk++;
}
watch.Stop();
Console.WriteLine(watch.ElapsedMilliseconds + "ms; chk: " + chk);
chk = 0;
watch = Stopwatch.StartNew();
CompareInfo ci = CultureInfo.CurrentCulture.CompareInfo;
for (int i = 0; i < LOOP; i++)
{
if (ci.IsPrefix(s1, s2)) chk++;
}
watch.Stop();
Console.WriteLine(watch.ElapsedMilliseconds + "ms; chk: " + chk);
}
}
IsPrefix के स्रोत को देखें। बात यह है कि - कुछ मामलों में, यह StartsWith
से धीमा होने वाला है क्योंकि यह वास्तव में स्टार्ट्सविथ का उपयोग करता है और कुछ और संचालन करता है।
[System.Security.SecuritySafeCritical] // auto-generated
public unsafe virtual bool IsPrefix(String source, String prefix, CompareOptions options)
{
if (source == null || prefix == null) {
throw new ArgumentNullException((source == null ? "source" : "prefix"),
Environment.GetResourceString("ArgumentNull_String"));
}
Contract.EndContractBlock();
int prefixLen = prefix.Length;
if (prefixLen == 0)
{
return (true);
}
if (options == CompareOptions.OrdinalIgnoreCase)
{
return source.StartsWith(prefix, StringComparison.OrdinalIgnoreCase);
}
if (options == CompareOptions.Ordinal)
{
return source.StartsWith(prefix, StringComparison.Ordinal);
}
if ((options & ValidIndexMaskOffFlags) != 0) {
throw new ArgumentException(Environment.GetResourceString("Argument_InvalidFlag"), "options");
}
// to let the sorting DLL do the call optimization in case of Ascii strings, we check if the strings are in Ascii and then send the flag RESERVED_FIND_ASCII_STRING to
// the sorting DLL API SortFindString so sorting DLL don't have to check if the string is Ascii with every call to SortFindString.
return (InternalFindNLSStringEx(
m_dataHandle, m_handleOrigin, m_sortName,
GetNativeCompareFlags(options) | Win32Native.FIND_STARTSWITH | ((source.IsAscii() && prefix.IsAscii()) ? RESERVED_FIND_ASCII_STRING : 0),
source, source.Length, 0, prefix, prefix.Length) > -1);
}
- 1. फ़ंक्शन अभिव्यक्ति की तुलना में फ़ंक्शन घोषणा तेज है?
- 2. सी #+ से सी # संकलित क्यों तेज है?
- 3. एक सदस्य फ़ंक्शन पॉइंटर की तुलना एनयूएलएल की तुलना में एक चेतावनी उत्पन्न क्यों करती है?
- 4. ostringstream की तुलना में snprintf तेज क्यों है या है ना?
- 5. "तेज" सी में तेज घोषणा में कीवर्ड
- 6. बुलबुले का जावास्क्रिप्ट कार्यान्वयन अन्य एल्गोरिदम को सॉर्ट करने की तुलना में बहुत तेज क्यों है?
- 7. फ़ील्ड एक्सेस की तुलना में विधि पहुंच तेज क्यों लगती है?
- 8. सी # सी ++ में फ़ंक्शन पॉइंटर्स की तुलना में सी # में प्रतिनिधि कैसे बेहतर हैं?
- 9. String.IsNullOrEmpty स्ट्रिंग की तुलना में तेज़ क्यों है। लम्बाई?
- 10. सी में snwprintf फ़ंक्शन क्यों नहीं है?
- 11. एंड्रॉइड की तुलना में आईओएस एमुलेटर बहुत तेज़ क्यों है?
- 12. विम में \ (\) से \ \ (\) तेज क्यों है?
- 13. PHP: हमें स्ट्रिंग तुलना फ़ंक्शन की आवश्यकता क्यों है?
- 14. सी # जेनरिक सी ++ टेम्पलेट्स की तुलना में
- 15. क्या जावा से तेज सी/सी ++ में एंड्रॉइड विकास है?
- 16. CUDA: लॉजिकल ऑपरेटरों की तुलना में कभी-कभी बिटवाई ऑपरेटर क्यों तेज होते हैं?
- 17. स्ट्रिंग की तुलना में मेरी स्ट्रिंग क्यों विफल रही है?
- 18. क्लोजर में, फ़ंक्शन, उद्धृत फ़ंक्शन और तेज-कोट फ़ंक्शन
- 19. RavenDB StartsWith
- 20. संग्रह क्यों है। काउंटर की तुलना में बहुत धीमी है।
- 21. दो टीस्ट्रीम की सामग्री की तुलना में डेल्फी फ़ंक्शन?
- 22. सी # CreateObject क्यों VB.NET की तुलना में इतना अधिक verbose है?
- 23. क्यों mmap() अनुक्रमिक आईओ से तेज है?
- 24. तुलना CONVERT में तुलना क्यों नहीं करती है?
- 25. वर्चुअल फ़ंक्शन कॉल गतिशील_कास्ट से तेज क्यों है?
- 26. PHP में फ़ंक्शन स्ट्रैटोक() का उपयोग, अन्य स्ट्रिंग फ़ंक्शन की तुलना में बेहतर कैसे है?
- 27. सी ++ में पोस्टिनक्रिकमेंट की तुलना में तेज़ी से बढ़ाना - सच? यदि हां, तो यह क्यों है?
- 28. सी # में एक स्पष्ट कलाकार की तुलना में एक सामान्य प्रकार धीमा क्यों है?
- 29. इरलांग में फ़ंक्शन परिणाम की तुलना क्यों एक अवैध गार्ड अपवाद है?
- 30. प्रोटोटाइप डिफ़ॉल्ट घोषित फ़ंक्शन की तुलना में 40x धीमा क्यों है?