2012-08-22 16 views
5
#define getcx getchar_unlocked 
inline void inp(int &n)//fast input function 
{ 
    n=0; 
    int ch=getcx();int sign=1; 
    while(ch < '0' || ch > '9'){if(ch=='-')sign=-1; ch=getcx();} 

    while( ch >= '0' && ch <= '9') 
      n = (n<<3)+(n<<1) + ch-'0', ch=getcx(); 
    n=n*sign; 
} 

हाय मैं विभिन्न कोडिंग प्रतियोगिताओं में इनपुट के लिए उपरोक्त फ़ंक्शन का उपयोग कर रहा हूं लेकिन यह समझने में कभी सक्षम नहीं था कि यह तेज़ क्यों है। मैं तर्क जानता हूं लेकिन इसकी तीव्रता की अवधारणा को नहीं जानता। उदाहरण के लिए यह लाइन "#define getcx getchar_unlocked" कर रही है। इसके अलावा, मैं किसी भी तेजी से उत्पादन समारोह पता नहीं है तो वहाँ किसी भी तेजी से उत्पादन समारोह भीफास्ट इनपुट आउटपुट फ़ंक्शन

+0

यहां इस विषय के बारे में एक और SO सवाल है: http://stackoverflow.com/questions/9052757/getchar-unlocked-vs-scanf-vs-cin –

+0

फ़ंक्शन के नाम से पता चलता है कि यह थ्रेड सुरक्षित नहीं है, एक थ्रेड सुरक्षित है एक सिंक्रनाइज़ेशन तंत्र का उपयोग कर इनपुट फ़ंक्शन एक महत्वपूर्ण प्रदर्शन ओवरहेड बनाम बना सकता है। –

+0

भयानक icky कोड स्वरूपण के आधार पर, मुझे लगता है कि यह एक उचित ढंग से लिखित कार्य से लिखने के लिए तेज़ था ... इसलिए यह 'तेज़' है। – Lundin

उत्तर

3

#define है getcx समारोह getchar_unlocked(), एक गैर ताला लगा चरित्र पढ़ने समारोह है, जिसके लिए एक छोटी-हाथ हो बनाने के लिए पूर्वप्रक्रमक का उपयोग करता है ।

यह थोड़ा भयानक है कि आप सी के इस सुंदर बुनियादी टुकड़ा समझने

मैनुअल पृष्ठ मैं ऊपर से जुड़ा हुआ उल्लेख putc_unlocked() जो काफी एक ही बात की तरह है, लेकिन उत्पादन के लिए लग रहा है बिना कई कोडिंग प्रतियोगिता में हिस्सा लिया है ।

3

getchar_unlocked() धागा getchar() कारण की असुरक्षित संस्करण getchar_unlocked()लगता है कि तेजी से है कि यह जहां यह एक चरित्र लाने के लिए माना जाता है से इनपुट धारा पर किसी भी ताले की जाँच नहीं करता है। तो अगर किसी अन्य थ्रेड ने इनपुट स्ट्रीम को लॉक कर दिया है, तो यह थ्रेड supposed to wait till lock count has come to zero है। लेकिन इस समारोह को इसके बारे में परवाह नहीं है, जिससे धागे के बीच सिंक्रनाइज़ेशन नष्ट हो जाता है।

लेकिन यदि आप सुनिश्चित हैं कि सिंक्रनाइज़ेशन की कमी आपको नुकसान पहुंचाएगी, तो यह फ़ंक्शन आपको थोड़ा तेज होने में मदद कर सकता है।

साथ ही, इसके advised है कि आप इसे सुरक्षित रूप से केवल जब प्रेरक धागा का उपयोग कर stdin बंद कर दिया गया का उपयोग कर सकते flockfile() (या ftrylockfile())।

2

getcx नामक एक मैक्रो को परिभाषित करें जैसे कि पढ़ने के दौरान कोई ताले का उपयोग नहीं किया जाएगा। यह सुरक्षित है, लेकिन तेजी से थ्रेड नहीं है, तो आप धागा सुरक्षा के बारे में चिंतित नहीं हैं:

#define getcx getchar_unlocked 

इनलाइन के रूप में परिभाषित inp इतना है कि यह तेजी से होता है:

inline void inp(int &n)//fast input function 
{ 
    n=0; 
    int ch=getcx();int sign=1; 
    while(ch < '0' || ch > '9'){if(ch=='-')sign=-1; ch=getcx();} 

गुणा n 10 (पारी का उपयोग करके गणना करने के लिए 8 * n + 2 * n है, जो तेजी से हो सकता है):

while( ch >= '0' && ch <= '9') 
      n = (n<<3)+(n<<1) + ch-'0', ch=getcx(); 
    n=n*sign; 
} 

आप putchar_unlocked उपयोग कर सकते हैं एक तेजी से उत्पादन कार्य हो जब धागा सुरक्षा कोई मुद्दा नहीं है।

+3

"* 8 * एन + 2 * एन की गणना करने के लिए शिफ़्ट का उपयोग करके, जो तेज़ है *" - जो ** आपके कंपाइलर, सीपीयू, ऑप्टिमाइज़ेशन और कई अन्य कारकों के आधार पर धीमा हो सकता है ** या धीमा हो सकता है। –