stat()
सिस्टम कॉल वास्तव में महंगा है? मैंने कहीं पढ़ा है कि यह उपयोग करने के लिए एक महंगा सिस्टम कॉल है। सच्ची में? यदि ऐसा कोई अन्य विकल्प है?क्या स्टेट() एक महंगी सिस्टम कॉल है?
उत्तर
एक विशिष्ट सेटिंग में, stat(2)
, fstat(2)
, और lstat(2)
फ़ाइल जानकारी प्राप्त करने के लिए एकमात्र सायन तकनीक हैं। यदि आप प्रदर्शन की समस्याएं देख रहे हैं, तो अपने आवेदन को प्रोफाइल करना और देखें कि क्या होता है।
प्रोफाइल करने के लिए, gcc -pg
के साथ संकलित करें और gprof(1)
के साथ निष्पादन योग्य चलाएं।
आप संभावित रूप से क्यूटी जैसी बड़ी लाइब्रेरी का उपयोग करने के लिए स्विच कर सकते हैं, लेकिन यह किसी भी प्रदर्शन की समस्याओं को संभालने की संभावना नहीं रखता है, और वे शायद stat(2)
का उपयोग करेंगे।
तो, चाहे यह महंगा है या नहीं, कोई उचित विकल्प नहीं हैं।
यह कहा गया कि जिम मैकनामारा की टिप्पणी में, यह इन कारणों से महंगा नहीं है। चूंकि कोई अन्य विकल्प नहीं है, इसलिए ग्लिब और लिनक्स प्रोग्रामर ने इसे यथासंभव प्रदर्शन के रूप में बनाया है।
साथ ही, प्रोफ़ाइल परिणामों के बारे में बहुत सावधान रहने पर विचार करें जिन्हें आप एक से अधिक बार चलाते हैं। आपके द्वारा छूए गए प्रत्येक फ़ाइल को कैश किया जाएगा, इसलिए जब आप पुन: चालू करते हैं तो दूसरी रन फ़ाइलों के उसी सेट पर अधिक तेज़ी से दिखाई देगी। –
दिल के दौरे के बाद खुले दिल की सर्जरी की तरह सॉर्ट करें ... हाँ यह महंगा है, लेकिन विकल्प क्या है ...? – Jonathan
और सर्जरी टीम दुनिया भर से सी प्रोग्रामर की अविश्वसनीय प्रतिभाशाली टीम है? –
प्रश्न "महंगी v/s आवश्यक" के रूप में उठता है।
यूनिक्स पर प्रत्येक प्रक्रिया दो मोड में चलती है: "उपयोगकर्ता स्थान" और "कर्नेल स्पेस", और जब सिस्टम ओपन(), लिखना(), stat() जारी होता है, तो प्रक्रिया उपयोगकर्ता स्थान से स्थानांतरित होती है कर्नेल मोड जो महंगा है लेकिन केवल तभी हम इस सिस्टम कॉल के साथ सार्थक कुछ भी नहीं कर रहे हैं। जैसे कि आप फ़ाइल के अंतिम एक्सेस किए गए समय को मुद्रित करने के लिए stat() का उपयोग कर रहे हैं और कुछ भी नहीं कर रहे हैं, तो शायद मुझे इससे बचा जाना चाहिए ।
तो सबसे पहले, stat() को कॉल करने का एक अच्छा कारण होना चाहिए। दूसरा, यदि आप अपने कोड के विभिन्न टुकड़ों के सापेक्ष निष्पादन समय की तुलना करना चाहते हैं, तो किसी भी प्रोफाइलिंग टूल का उपयोग करें, जो आपको यह साबित करने के लिए सटीक आंकड़े प्रदान करेगा कि कौन सा फ़ंक्शन कॉल महंगा है और जो नहीं है।
आप और क्या करने का प्रस्ताव करते हैं? स्टेट से बचने का कोई मतलब नहीं है। यदि आपने किसी भी समय निर्देशिका में ls किया था तो फ़ाइलों को शायद पहले से ही कैश किया गया है। वैसे भी - तो आप कैसे mtime प्राप्त करते हैं? स्टेट कॉल करने या एलएस का उपयोग करने के अलावा जो कॉल कहते हैं। –
आप अपने निष्पादन योग्य में हमेशा strace
का उपयोग कर सकते हैं। पुन: संकलित करने की कोई आवश्यकता नहीं है। यह फ़ंक्शन आपको प्रत्येक सिस्टम कॉल के लिए वास्तविक निष्पादन समय प्राप्त करने की अनुमति देता है।
- 1. संदर्भ.getSystemService() एक महंगी कॉल है?
- 2. स्टेट सिस्टम कॉल के st_mode के लिए झंडे
- 3. पढ़ना/लिखना प्राथमिकताएं एक महंगी ऑपरेशन है?
- 4. "ब्लॉकिंग सिस्टम कॉल" का क्या अर्थ है?
- 5. क्या एक पर्ल सिस्टम() कॉल कभी मर सकता है?
- 6. सिस्टम कॉल और लाइब्रेरी कॉल के बीच क्या अंतर है?
- 7. सिस्टम कॉल?
- 8. क्रैशलॉग: "एआरएम थ्रेड स्टेट" क्या है
- 9. तूफान में ट्राइडेंट स्टेट क्या है?
- 10. एक ऑपरेटिंग सिस्टम में, सिस्टम कॉल और बाधा के बीच क्या अंतर है?
- 11. सॉकेट निर्माण-हटाना बहुत महंगी प्रक्रिया है?
- 12. आर और सिस्टम कॉल
- 13. BASE में 'सॉफ्ट-स्टेट' का क्या अर्थ है?
- 14. सिस्टम कॉल को ptrace
- 15. खुला() सिस्टम कॉल बहुरूपता
- 16. ओपन() सिस्टम कॉल
- 17. पेजिंग इतनी संसाधन-महंगी क्यों है?
- 18. क्या एलकेएम के माध्यम से सिस्टम कॉल जोड़ना संभव है?
- 19. सिस्टम कॉल लिखें, बाइट्स सीमा की संख्या क्या है?
- 20. getcontext सिस्टम कॉल (ucontext.h) वास्तव में क्या करता है?
- 21. कौन सा खोल एक पर्ल सिस्टम() कॉल उपयोग करता है?
- 22. फ़ाइल इतनी महंगी संसाधन क्यों संभालती है?
- 23. लिनक्स पर सिस्टम कॉल तर्कों का प्रकार क्या है?
- 24. क्या मैकोज़ पर gettimeofday() सिस्टम कॉल का उपयोग करता है?
- 25. NHibernate AutoFlush इतनी महंगी क्यों जांचता है?
- 26. एमएमएपी सिस्टम कॉल में MAP_ANONYMOUS ध्वज का उद्देश्य क्या है?
- 27. एएमडी पावरनो स्टेट चेंज ऑपरेशन में विलंबता क्या है?
- 28. यूनिक्स फोर्क() सिस्टम कॉल कब चलता है?
- 29. execlp() सिस्टम कॉल कैसे काम करता है?
- 30. MySQL घटनाएं कितनी महंगी हैं?
'महंगा()'? क्या वह एक और सिस्टम कॉल है? – devnull
क्या आपने यह देखने के लिए प्रोफाइलिंग की कोशिश की है कि वास्तव में लागत क्या है? – ssube
संक्षिप्त उत्तर नहीं है। एकमात्र महंगा हिस्सा डिस्क से फ़ाइल के इनोड को पढ़ रहा है। चूंकि लिनक्स कैश बहुत प्रभावी ढंग से कैश करता है, इसलिए बहुत अधिक फाइल जो किसी भी तरह से देखी गई है क्योंकि बूट समय में पहले से ही कैश में इनोड बचाया गया होगा। एक्सेस() जैसी अन्य कॉलें हैं, लेकिन यह वैसे भी स्टेट() को कॉल करती है। fopen() या सिर्फ सादा खुला अधिक संसाधनों का उपयोग करता है। –