2013-06-17 6 views
14

stat() सिस्टम कॉल वास्तव में महंगा है? मैंने कहीं पढ़ा है कि यह उपयोग करने के लिए एक महंगा सिस्टम कॉल है। सच्ची में? यदि ऐसा कोई अन्य विकल्प है?क्या स्टेट() एक महंगी सिस्टम कॉल है?

+5

'महंगा()'? क्या वह एक और सिस्टम कॉल है? – devnull

+4

क्या आपने यह देखने के लिए प्रोफाइलिंग की कोशिश की है कि वास्तव में लागत क्या है? – ssube

+7

संक्षिप्त उत्तर नहीं है। एकमात्र महंगा हिस्सा डिस्क से फ़ाइल के इनोड को पढ़ रहा है। चूंकि लिनक्स कैश बहुत प्रभावी ढंग से कैश करता है, इसलिए बहुत अधिक फाइल जो किसी भी तरह से देखी गई है क्योंकि बूट समय में पहले से ही कैश में इनोड बचाया गया होगा। एक्सेस() जैसी अन्य कॉलें हैं, लेकिन यह वैसे भी स्टेट() को कॉल करती है। fopen() या सिर्फ सादा खुला अधिक संसाधनों का उपयोग करता है। –

उत्तर

19

एक विशिष्ट सेटिंग में, stat(2), fstat(2), और lstat(2) फ़ाइल जानकारी प्राप्त करने के लिए एकमात्र सायन तकनीक हैं। यदि आप प्रदर्शन की समस्याएं देख रहे हैं, तो अपने आवेदन को प्रोफाइल करना और देखें कि क्या होता है।

प्रोफाइल करने के लिए, gcc -pg के साथ संकलित करें और gprof(1) के साथ निष्पादन योग्य चलाएं।

आप संभावित रूप से क्यूटी जैसी बड़ी लाइब्रेरी का उपयोग करने के लिए स्विच कर सकते हैं, लेकिन यह किसी भी प्रदर्शन की समस्याओं को संभालने की संभावना नहीं रखता है, और वे शायद stat(2) का उपयोग करेंगे।

तो, चाहे यह महंगा है या नहीं, कोई उचित विकल्प नहीं हैं।

यह कहा गया कि जिम मैकनामारा की टिप्पणी में, यह इन कारणों से महंगा नहीं है। चूंकि कोई अन्य विकल्प नहीं है, इसलिए ग्लिब और लिनक्स प्रोग्रामर ने इसे यथासंभव प्रदर्शन के रूप में बनाया है।

+2

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

+1

दिल के दौरे के बाद खुले दिल की सर्जरी की तरह सॉर्ट करें ... हाँ यह महंगा है, लेकिन विकल्प क्या है ...? – Jonathan

+0

और सर्जरी टीम दुनिया भर से सी प्रोग्रामर की अविश्वसनीय प्रतिभाशाली टीम है? –

3

प्रश्न "महंगी v/s आवश्यक" के रूप में उठता है।

यूनिक्स पर प्रत्येक प्रक्रिया दो मोड में चलती है: "उपयोगकर्ता स्थान" और "कर्नेल स्पेस", और जब सिस्टम ओपन(), लिखना(), stat() जारी होता है, तो प्रक्रिया उपयोगकर्ता स्थान से स्थानांतरित होती है कर्नेल मोड जो महंगा है लेकिन केवल तभी हम इस सिस्टम कॉल के साथ सार्थक कुछ भी नहीं कर रहे हैं। जैसे कि आप फ़ाइल के अंतिम एक्सेस किए गए समय को मुद्रित करने के लिए stat() का उपयोग कर रहे हैं और कुछ भी नहीं कर रहे हैं, तो शायद मुझे इससे बचा जाना चाहिए ।

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

+3

आप और क्या करने का प्रस्ताव करते हैं? स्टेट से बचने का कोई मतलब नहीं है। यदि आपने किसी भी समय निर्देशिका में ls किया था तो फ़ाइलों को शायद पहले से ही कैश किया गया है। वैसे भी - तो आप कैसे mtime प्राप्त करते हैं? स्टेट कॉल करने या एलएस का उपयोग करने के अलावा जो कॉल कहते हैं। –

4

आप अपने निष्पादन योग्य में हमेशा strace का उपयोग कर सकते हैं। पुन: संकलित करने की कोई आवश्यकता नहीं है। यह फ़ंक्शन आपको प्रत्येक सिस्टम कॉल के लिए वास्तविक निष्पादन समय प्राप्त करने की अनुमति देता है।

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