2009-06-12 8 views
8

मैंने हमेशा यह सोचा है। मुझे हमेशा लिखने की हर स्क्रिप्ट के शीर्ष परशीर्ष पर एक पर्ल स्क्रिप्ट में ओवरहेड "उपयोग ...." करता है?

use strict; 
use warnings; 
use Data::Dumper; 

जोड़ने की आदत है। अगर मैं डम्पर फ़ंक्शन का उपयोग भी नहीं करता तो क्या यह ओवरहेड जोड़ता है? इसके अलावा, ज्यादातर मामलों में डेटा :: डम्पर को पहले किसी अन्य पैकेज में बुलाया गया था लेकिन मुझे इस पैकेज में इसकी आवश्यकता है ताकि मैं इसे फिर से शामिल कर सकूं। इस मामले में यह अतिरिक्त ओवरहेड का उत्पादन करता है?

उत्तर

10

यदि उनके पास BEGIN ब्लॉक या import दिनचर्या हैं, तो हाँ, यह हमेशा ओवरहेड जोड़ता है। इसके अलावा किसी भी मेनलाइन कोड को अंततः निष्पादित किया जाएगा और INIT, CHECK, और END ब्लॉक भी निष्पादित किए जाएंगे।

एकमात्र तरीका यह ओवरहेड नहीं जोड़ता है यदि मॉड्यूल userequire से अधिक कुछ नहीं होने की अपेक्षा करता है। (बेशक, requireभीimport दिनचर्या के अलावा सब कुछ चलाता है, लेकिन यही कारण है कि मैं use -d मॉड्यूल से देखने का उल्लेख किया है। यह "उम्मीद" लेकिन एक सरल require कुछ भी नहीं हो सकता है।)

आप चाहते हैं उस कारण को बनाए रखें, किसी कारण से, बस इसे टिप्पणी करें। विकास में, मॉड्यूल होना ठीक है जिसका आप उपयोग नहीं करते हैं। क्यूए या उत्पादन में, यह एक गलती है, आईएमओ।

+1

लेकिन विकास को यथासंभव संभवतः उत्पादन दर्पण करना चाहिए। मैं डेटा :: डूपर हमेशा कुछ विकास में शामिल होने की तुलना में हमेशा शामिल था। – ysth

+1

निश्चित रूप से, और यही कारण है कि जब आप इसे चेक आउट करते हैं, तो इसमें "#use डेटा :: डम्पर;" होना चाहिए इस में। चूंकि आप अक्सर विकास में चीजों को बदलने जा रहे हैं, लाइन को असम्बद्ध करें और आप जाने के लिए अच्छे हैं। यदि आप इसे वापस उत्पादन में कैसे काम करना चाहते हैं, तो फिर लाइन को फिर से टिप्पणी करें। – Axeman

9

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

1

यह महत्वपूर्ण हो सकता है कि आपकी स्क्रिप्ट बार-बार निष्पादित की जाती है और विलंबता या रन-टाइम बाधा होती है।

उदाहरण के लिए, यदि यह एक वेब पेज प्रदान किए जाने पर हर बार एक प्रक्रिया को फोर्क किया जाता है, तो संभवतः आप अप्रयुक्त मॉड्यूल को हटाकर लोड करने के दौरान पार्स की मात्रा को कम करना चाहते हैं।

या यदि आप xargs के दाईं ओर perl चला रहे हैं।

वेब सर्वर स्थिति में उस ओवरहेड को हटाने के अन्य तरीके हैं।

4

प्रत्येक स्क्रिप्ट आपकी स्क्रिप्ट शुरू होने से पहले समय का उपभोग करती है और संभवतः स्क्रिप्ट की स्मृति पदचिह्न को बढ़ाती है। भूमि के ऊपर का परीक्षण करने के लिए, आपको निम्न स्क्रिप्ट चला सकते हैं:

कार्य प्रबंधक में
C:\Temp> cat zzz.pl 
#!/usr/bin/perl 
sleep 10; 

C:\Temp> timethis zzz.pl 
TimeThis : Elapsed Time : 00:00:10.172 

मेमोरी पदचिह्न 2548K था।

अब जोड़ने

use Data::Dumper; 

और परीक्षण फिर से:

TimeThis : Elapsed Time : 00:00:10.266 

इस बार, स्मृति पदचिह्न 3408K था। इसलिए, यदि आप जिस मॉड्यूल का उपयोग करते हैं, वह वास्तव में उपयोग नहीं किया जाता है तो आप कुछ समय और कुछ स्मृति बर्बाद कर देते हैं।

स्टार्टअप समय बार-बार (सीजीआई की तरह) और मेमोरी पदचिह्न मामलों में शामिल होता है, अन्य मामलों के साथ, लंबे समय तक चलने वाली स्क्रिप्ट और स्क्रिप्ट में।

1

यदि आप पूछते हैं कि आपको यह बुरा नहीं लगता है। हाँ, यह कुछ ओवरहेड जोड़ता है। कोड:

use Data::Dumper; 

के लगभग सटीक बराबर है:

BEGIN { 
    require Data::Dumper; 
    Data::Dumper->import(); 
} 

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

use Data::Dumper(); 

से आप Dumper() कॉल नहीं कर सकते, लेकिन आप Data::Dumper::Dumper() उपयोग करना चाहिए। मैं Data::Dumper->Dump([vars], [names]) का उपयोग करना पसंद करता हूं जो मुझे आउटपुट लाता है जो मुझे और पसंद है।

0

यह आपके द्वारा पूछे जाने वाले कुछ नहीं है, लेकिन मुझे डेटा :: डूपर पर एक क्रैच और ब्रेकिंग की आदत होने पर भरोसा है। चूंकि पर्ल का मानना ​​है कि साथी कोड मानने के दर्शन को दुर्भावनापूर्ण के बजाय मित्रवत है, यह प्रोग्रामर के लिए बहुत ही मोहक है: यह एक अपारदर्शी वस्तु को डंप करें कि यह पता लगाने के लिए कि इसके आंतरिक कैसे संग्रहीत किए जाते हैं, और फिर उन आंतरिकों तक सीधे पहुंचने के बजाय, प्रदान की गई इंटरफेस। डेटा :: डम्पर इनसाइड-आउट ऑब्जेक्ट्स का निर्माण करने के कारणों में से एक है - इसे खतरनाक लेकिन अधीर प्रोग्रामर आंतरिक के माध्यम से घूमने के लिए कठिन/असंभव बनाने के लिए।

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