तो मैं कुछ कोड के साथ खेल रहा था और देखना चाहता था कि std :: स्ट्रिंग को ऊपरी मामले में बदलने की कौन सी विधि सबसे कुशल थी। मैंने सोचा कि दोनों कुछ समान प्रदर्शन के समान होंगे, लेकिन मैं बहुत गलत था। अब मैं जानना चाहता हूं क्यों।std :: स्ट्रिंग को ऊपरी मामले में परिवर्तित करना: प्रमुख प्रदर्शन अंतर?
स्ट्रिंग को परिवर्तित करने की पहली विधि निम्नानुसार है: स्ट्रिंग में प्रत्येक वर्ण के लिए (लंबाई को बचाने, 0 से लंबाई तक), अगर यह 'ए' और 'z' के बीच है, तो इसे बदलें इसके बजाय 'ए' और 'जेड' के बीच।
दूसरी विधि निम्नानुसार काम करती है: स्ट्रिंग में प्रत्येक वर्ण के लिए (0 से शुरू करें, जब तक हम शून्य टर्मिनेटर नहीं दबाते) तब तक टचपर() फ़ंक्शन में लागू करें।
#include <iostream>
#include <string>
inline std::string ToUpper_Reg(std::string str)
{
for (int pos = 0, sz = str.length(); pos < sz; ++pos)
{
if (str[pos] >= 'a' && str[pos] <= 'z') { str[pos] += ('A' - 'a'); }
}
return str;
}
inline std::string ToUpper_Alt(std::string str)
{
for (int pos = 0; str[pos] != '\0'; ++pos) { str[pos] = toupper(str[pos]); }
return str;
}
int main()
{
std::string test = " [email protected]#$%^&*()_+=-`'{}[]\\|\";:<>,./?";
for (size_t i = 0; i < 100000000; ++i) { ToUpper_Reg(test); /* ToUpper_Alt(test); */ }
return 0;
}
पहली विधि ToUpper_Reg
के बारे में 169 सेकंड में 100 मिलियन पुनरावृत्तियों प्रति ले लिया:
कोड यह रहा।
दूसरी विधि Toupper_Alt
ने लगभग 10012 पुनरावृत्तियों के बारे में 37 9 सेकंड लिया।
क्या देता है?
संपादित करें: मैं दूसरी विधि बदल इतना है कि यह स्ट्रिंग iterates कैसे पहले एक है के बारे में दो बार के रूप (लंबाई अलग पाश निर्धारित करते हैं, जबकि लंबाई से भी कम) और यह थोड़ा तेज है, लेकिन अभी भी धीमी गति से।
संपादित करें 2: अपनी प्रस्तुतियाँ के लिए धन्यवाद हर कोई! जिस डेटा का मैं उपयोग कर रहा हूं वह एएससीआई होने की गारंटी है, इसलिए मुझे लगता है कि मैं उस समय के लिए पहली विधि के साथ चिपके रहूंगा। मुझे यह ध्यान में रखेगा कि toupper
लोकल विशिष्ट है जब मुझे इसकी आवश्यकता होती है।
toupper _Reg में आपके द्वारा किए गए कार्यों की तुलना में धीमा है क्योंकि यह रेग में आपके से अधिक करता है? – Almo
आप मानक सी ++ इन-प्लेस रूपांतरण क्यों नहीं जोड़ते हैं, 'std :: transform (s.begin(), s.end(), s.begin(), (int (*) (int)) std :: toupper); '? (आपको ',' 'और' 'शामिल करना होगा। –
वाह, यह एक मुट्ठी भर है। जिज्ञासा से, '(int (*) (int)) 'भाग के साथ क्या है? –