मेरे पास एक बहुत लंबी स्ट्रिंग है (60MB आकार में) जिसमें मुझे यह पता लगाना होगा कि '<' और '>' के कितने जोड़े हैं।सी # की स्ट्रिंग.इंडेक्सओफ़ इतनी तेजी से कैसे कर सकता है, लूप खोजने के लिए सामान्य से 10 गुना तेज?
char pre = '!';
int match1 = 0;
for (int j = 0; j < html.Length; j++)
{
char c = html[j];
if (pre == '<' && c == '>') //find a match
{
pre = '!';
match1++;
}
else if (pre == '!' && c == '<')
pre = '<';
}
ऊपर कोड मोटे तौर पर 1000 एमएस के लिए मेरे स्ट्रिंग पर चलता है:
मैं पहली बार अपने तरीके से कोशिश की है।
तो मैं इसके बाद के संस्करण कोड केवल लगभग 150 एमएस के लिए चलाता है string.IndexOf
int match2 = 0;
int index = -1;
do
{
index = html.IndexOf('<', index + 1);
if (index != -1) // find a match
{
index = html.IndexOf('>', index + 1);
if (index != -1)
match2++;
}
} while (index != -1);
उपयोग करने की कोशिश।
मैं सोच रहा हूँ जादू कि string.IndexOf
रन इतनी तेजी से बनाता है क्या?
कोई भी मुझे प्रेरित कर सकता है?
संपादित
ठीक है, @ BrokenGlass के जवाब के अनुसार। मैंने अपने कोड को इस तरह से संशोधित किया कि वे जोड़ी की जांच नहीं करते हैं, इसके बजाय, वे स्ट्रिंग में कितने '<' की जांच करते हैं।
for (int j = 0; j < html.Length; j++)
{
char c = html[j];
if (c == '>')
{
match1++;
}
}
ऊपर कोड के आसपास 760 एमएस के लिए चलाता है।
IndexOf
int index = -1;
do
{
index = html.IndexOf('<', index + 1);
if (index != -1)
{
match2++;
}
} while (index != -1);
उपरोक्त कोड का उपयोग कर के बारे में 132 एमएस के लिए चलाता है। अभी भी बहुत तेज़ है।
संपादित 2
के बाद पढ़ा @Jeffrey सैक्स टिप्पणी, मुझे एहसास हुआ कि मैं डीबग मोड के साथ वी.एस. में चल रहा था।
फिर मैंने रिलीज मोड में बनाया और भाग लिया, ठीक है, IndexOf
अभी भी तेज़ है, लेकिन यह तेज़ नहीं है।
जोड़ी गिनती के लिए:: 207ms वी.एस. 144ms
सामान्य से एक चार गिनती के लिए: 141ms वी.एस. 111ms
यहाँ परिणाम है।
मेरे अपने कोड का प्रदर्शन वास्तव में बेहतर हुआ था।
सबक सीखा है: जब आप बेंचमार्क सामान करते हैं, को रिलीज़ मोड में यह करते हैं!
क्या आपने परीक्षण करते समय अनुकूलन सक्षम किया था? –
क्या आपने देखा है कि 'string.IndexOf' दृश्यों के पीछे क्या कर रहा है? – zimdanen
@MartinLiversage अनुकूलन कैसे सक्षम करें? – Jack