2013-02-21 7 views
8

मैं अपने कोड में एक बहुत ही महत्वपूर्ण महत्वपूर्ण स्थान में वर्तमान चलने वाले थ्रेड की आईडी का उपयोग करने जा रहा हूं, इसलिए मुझे यह चुनना चाहिए कि उस आईडी को कहीं कैश करना है या किसी विधि को कॉल करना है (gettid यूनिक्स-जैसी प्रणालियों के लिए और GetCurrentThreadId विंडोज़ के लिए) हर बार इसे पाने के लिए। तो कौन सा बेहतर है? थ्रेड आईडी एक सिस्टम कॉल हो रही है?वर्तमान थ्रेड समय की आईडी प्राप्त करने का संचालन महंगा है?

उत्तर

0

नहीं, यह एक महंगी कॉल नहीं है। यह एक सिस्टम कॉल या समान है, लेकिन एक महंगी से बहुत दूर है। जाहिर है, यदि आप एक वैरिएबल वैरिएबल में वैल्यू कैश कर सकते हैं तो यह 10 के कारक से तेज़ी से बढ़ेगा।

लेकिन सभी प्रदर्शन संबंधी प्रश्नों की तरह, यह वास्तव में आपके बेंचमार्किंग पर है। आप एक थ्रेड का उपयोग करने के लिए चीजों को आसानी से सेट कर सकते हैं, थ्रेड आईडी प्राप्त करने के लिए फ़ंक्शन को कॉल कर सकते हैं, और जो भी आप करना चाहते हैं उसे करें। मापें कि इसके साथ कुछ परीक्षण चलाने में कितना समय लगता है। फिर थ्रेड आईडी के लिए उसी श्रेणी में स्थिर मान के साथ कॉल को प्रतिस्थापित करें, और देखें कि यह कैसे काम करता है।

7

कम से कम विंडोज़ में, GetCurrentThreadId()काफी सस्ते है, और इसमें सिस्टम कॉल शामिल नहीं है। मूल रूप से यह करने के लिए बाहर काम करता है:

int GetCurrentThreadId() { 
    _asm { 
     mov eax, fs:[18h] 
     mov eax, [eax+24h] 
    } 
} 

अपनी खुद की वैरिएबल के मान कैशिंग करने के लिए एक छोटे से लाभ, लेकिन नहीं एक बहुत वहाँ हो सकता है। मुख्य लाभ संभवतः होगा यदि आपने अपने चर को अन्य अक्सर उपयोग किए जाने वाले चर के साथ संग्रहीत किया है, जो इलाके में सुधार कर सकता है (और इसलिए कैश उपयोग)।

तो, जब तक कि आप इस तरह के तंग लूप पर काम नहीं कर रहे हैं कि स्मृति मेमोरी (या संभवतः दो) को खत्म करने की संभावना महत्वपूर्ण है, तो आपके द्वारा लौटाए जाने वाले मूल्य को कैश करके बहुत अधिक लाभ उठाने की संभावना नहीं है।

+1

मैंने यूनिक्स (एस) को ऐसा ही देखा है (लेकिन जीएस के साथ, यह महत्वपूर्ण नहीं है)। तो आपका जवाब कई प्लेटफार्मों के लिए सही है। यह बहुत स्सता है। – boiler96

संबंधित मुद्दे