2011-06-04 11 views
6

मैं इस http://code.google.com/speed/articles/optimizing-php.htmlPHP असाइनमेंट ऑपरेटर क्या करता है?

उसका दावा है कि इस कोड

$description = strip_tags($_POST['description']); 
echo $description; 

मेरी समझ में नीचे के रूप में अनुकूलित किया जाना चाहिए

echo strip_tags($_POST['description']); 

हालांकि, पढ़ने के लिए होता है, PHP में काम आपरेशन जरूरी नहीं बना है स्मृति में एक प्रति।

इसमें स्मृति में "एबीसी" की एक प्रति है।

$a = $b = "abc"; 

यह केवल एक स्मृति को बदलता है जब एक चर बदल जाता है।

$a = $b = "abc"; 
$a = "xyz"; 

क्या यह सही है?

+0

आपके पहले कोड खंड में, क्या आप बाद में '$ विवरण' का संदर्भ नहीं दे सकते? क्या यह इंगित नहीं करता है कि स्ट्रिंग को स्मृति में संग्रहीत किया जा रहा है? दूसरा खंड, हालांकि, फिर से संदर्भित नहीं किया जा सकता है। एक ही आउटपुट प्राप्त करने के लिए आपको एक बार फिर फ़ंक्शन का फिर से मूल्यांकन करना होगा। – Blender

उत्तर

5

नीचे

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

क्या यह सही है?

हां। इसे कॉपी-ऑन-राइट कहा जाता है।

+0

+1, आपने मुझे एक मिनट तक हराया! –

+0

क्या वास्तव में "अनावश्यक स्मृति खपत" है? मेरा मतलब है, अगर $ _POST ['description'] 512K है, तो क्या पहला ब्लॉक कोड डबल मेमोरी का उपभोग करता है? मुझे लगता है कि यह एक ही स्मृति लेता है, स्क्रिप्ट समाप्त होने से पहले स्मृति को रिलीज़ नहीं किया जाएगा। –

+1

@ मॉर्गन चेंग: '$ _POST ['description']' और '$ description' अलग हैं, क्योंकि' $ description' '$ _POST ['description'] की एक प्रति है, जिस पर आपने एक संशोधन (' strip_tags')। तो हाँ, POST चर के संदर्भ में यह अधिक स्मृति लेता है।इसके अलावा, लिपि को अंत में स्क्रिप्ट अंत में मुक्त नहीं किया जाता है, जब वेरिएबल गुंजाइश से बाहर हो जाता है तो इसे मुक्त किया जाता है। – netcoder

1

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

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

1

लेखक के पास एक बिंदु है जो एक चर में डेटा कॉपी करने के रूप में मेमोरी मेमोरी में रखता है जब तक चर unset नहीं है। यदि आपको बाद में डेटा की आवश्यकता नहीं है, तो यह वास्तव में बर्बाद स्मृति है।

अन्यथा शिखर मेमोरी खपत दोनों तरीकों के बीच कोई अंतर नहीं है, इसलिए उनकी तर्क ("प्रतिलिपि") गलत है।

+0

ठीक है, जब वे दायरे से बाहर निकलते हैं तो चर स्वचालित रूप से अनसेट हो जाएंगे। आप जो भी उल्लेख करते हैं वह प्रक्रियात्मक प्रोग्रामिंग में सच है, लेकिन वास्तव में एक उचित रूप से संरचित ओओ अनुप्रयोग में चिंता नहीं है। – netcoder

+0

@netcoder अनुमोदित, निश्चित है। लेकिन यदि आप एक ही दायरे में बहुत अधिक डेटा उत्पन्न करने जा रहे हैं तो यह एक चल रही स्क्रिप्ट और एक समाप्ति स्क्रिप्ट के बीच अंतर बना सकता है। :) – deceze

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