2010-11-02 16 views
8

मैं Code Complete 2 पढ़ रहा हूं, और उल्लिखित बिंदुओं में से एक है ऑपरेशन के लिए भी subroutines बनाने के बारे में है जो अपने स्वयं के subroutines होने के लिए बहुत आसान लग रहा है, और यह कैसे सहायक हो सकता है।मैं पर्ल सबराउटिन कैसे रेखांकित कर सकता हूं?

मुझे पता है कि मैं inline कीवर्ड का उपयोग कर inline functions in C and C++ कर सकता हूं। लेकिन मैं पर्ल में subroutines इनलाइन करने के लिए कभी नहीं आया था।

क्या पर्ल दुभाषिया को सबराउटिन कॉल (या क्यों नहीं) को रेखांकित करने का कोई तरीका है?

+0

आपको अभी भी सलाह का पालन करना चाहिए भले ही इनलाइनिंग के अवसर पर्ल में अधिक सीमित लगते हैं। –

उत्तर

21

लगातार उपरोक्त, यानी एक खाली प्रोटोटाइप और निरंतर वापसी मूल्य के साथ subroutines, इनलाइन हैं। यही कारण है कि कैसे constant pragma स्थिरांक को परिभाषित करता है: अगर यह इसके पहले उपयोग करने से पहले देखा जाता है

sub five() { 5 } 

inlined किया जाएगा।

अन्यथा, पर्ल रन-टाइम पर सबराउटिन को गतिशील रूप से फिर से परिभाषित करने की अनुमति देता है, इसलिए इनलाइनिंग उपयुक्त नहीं है।

subroutines के लिए जो हमेशा एक ही इनपुट को एक ही मान देता है, आप memoization का उपयोग कर सकते हैं।

Chapter 13 of Programming Perlperl द्वारा किए गए अनुकूलन चरणों पर कुछ जानकारी प्रदान करता है।

इसे निरंतर फोल्डिंग कहा जाता है। निरंतर फोल्डिंग सरल मामलों तक ही सीमित नहीं है जैसे कि संकलन समय पर 2 ** 10 को 1024 में बदलना। यह फंक्शन कॉल को भी हल करता है - दोनों अंतर्निर्मित और उपयोगकर्ता द्वारा घोषित सबराउटिन जो अध्याय 6, सबराउटिन में "कॉन्स्टेंट फ़ंक्शंस इनलाइनिंग" अनुभाग से मानदंडों को पूरा करते हैं। फोरट्रान कंपाइलर्स के अपने आंतरिक कार्यों के कुख्यात ज्ञान की याद ताजा करती है, पर्ल यह भी जानता है कि संकलन के दौरान कॉल करने के लिए अपने स्वयं के अंतर्निर्मित कौन से हैं। यही कारण है कि यदि आप 0.0 के लॉग या ऋणात्मक निरंतर के वर्ग को लेने का प्रयास करते हैं, तो आपको एक संकलन त्रुटि होगी, रन-टाइम त्रुटि नहीं, और दुभाषिया कभी भी नहीं चल रहा है।

perldoc perlguts भी देखें।

आप के प्रभाव को देख सकते हैं निरंतर तह खुद:

#!/usr/bin/perl 

use strict; use warnings; 

sub log_ok() { 1 } 

if (log_ok) { 
    warn "log ok\n"; 
} 
perl -MO=Deparse t.pl

आउटपुट:

sub log_ok() { 1 } 
use warnings; 
use strict 'refs'; 
do { 
    warn "log ok\n" 
}; 
t.pl syntax OK

यहाँ, निरंतर तह एक do ब्लॉक के साथ if ब्लॉक के प्रतिस्थापन के लिए नेतृत्व किया क्योंकि संकलक जानता था कि log_ok हमेशा एक वास्तविक मूल्य वापस करेगा।

#!/usr/bin/perl 

use strict; use warnings; 

sub log_ok() { 0.5 > rand } 

if (log_ok) { 
    warn "log ok\n"; 
} 

Deparse उत्पादन:: दूसरी ओर, के साथ पर

sub log_ok() { 
    use warnings; 
    use strict 'refs'; 
    0.5 > rand; 
} 
use warnings; 
use strict 'refs'; 
if (log_ok) { 
    warn "log ok\n"; 
} 
t.pl syntax OK

एक C संकलक if (0.5 > rand) साथ if (log_ok) जगह ले ली है हो सकता है। perl ऐसा नहीं करता है।

5

पर्ल केवल स्थिर कार्यों को रेखांकित करने की अनुमति देता है।perldoc perlsub से: के एक प्रोटोटाइप() के साथ

कार्य इनलाइन किए जाने वाले संभावित उम्मीदवार हैं। यदि अनुकूलन और निरंतर तह है के बाद परिणाम या तो एक निरंतर या एक lexically-दायरे वाले अदिश जो कोई अन्य संदर्भ होते हैं, तो यह फ़ंक्शन कॉल & बिना बना के स्थान पर इस्तेमाल किया जाएगा।

3

मैं इनमें से कोई प्रयास नहीं किया है, लेकिन अगर आप समय है, तो आप की कोशिश कर सकते

  1. Macro
  2. macro
  3. या यहाँ तक कि Filter::Macro

वे ' सभी स्रोत फ़िल्टर फिर से करें ताकि आपको प्रदर्शन में निवेश पर अपनी वापसी की जांच करनी पड़े। अंतिम वास्तव में cpanratings पर एक समीक्षा है। (ध्यान न दें पर्ल मॉड्यूल "हवाई क्षेत्र" को विनियमित करने के डैन डैस्केलेस्कु की कोशिश।)

- असल, पिछले एक Filter::Macro का उपयोग करता Filter::Simple::Compile (जो बारी में Module::Compile उपयोग करता है) दिनचर्या संकलित करने के लिए है, इसलिए इस ऊपर प्रदर्शन कर सकती है अन्य स्रोत फिल्टर विधियों। लेकिन standard caveats on source filters लागू होते हैं।

1

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

+0

;) समयपूर्व अनुकूलन सभी बुराइयों की जड़ है - डोनाल्ड ई। नूथ ने कहा, और ठीक है। – Jinxed

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

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