2009-01-10 9 views
8

वहाँ एक अंतर है या निम्न में से अन्य की तुलना में एक बेहतर है:PHP: क्या 1 लाइन या एकाधिक लाइनों पर concatenate बेहतर है? या क्या कोई अंतर है?

$var = ''; 
... 
$var .= 'blah blah'; 
$var .= $var2; 
$var .= 'blah blah'; 

या

$var = ''; 
... 
$var .= 'blah blah' . $var2 . 'blah blah'; 

वहाँ एक गति अंतर है या वहाँ एक कारण है कि तुम पर एक चुनना होता है अन्य?

उत्तर

6

यदि आप स्ट्रिंग को प्रतिबिंबित करते हैं तो एक छोटा सा अंतर होता है।

echo $var1,$var2,$var3 // comma (echo with multiple arguments) 

से

echo $var1.$var2.$var3 // dot (concat and echo) 
+15

जो कि सवाल नहीं था ... – nickf

0

मुझे नहीं लगता कि आपको ऐसी छोटी स्थिति के लिए नोटिस होगा। मैं आमतौर पर पठनीयता के कारणों का निर्णय लेता हूं जिन्हें मैं उपयोग करने जा रहा हूं। मैं केवल दो स्थितियों पर विभाजित हूं, अन्यथा एक पंक्ति पर:

ए) एक बहु-रेखा प्रतिक्रिया बनाना ताकि कोड कुछ हद तक नकल कर सके जो उपयोगकर्ता देखेंगे। मैंने पाया है कि इस तरह टाइपो और गलतियों को पकड़ना आसान बनाता है।

$var = "line 1 \n"; 
$var .= "line 2 \n"; 

बी) रेखा लंबाई। यदि लाइन मेरी खिड़की से बहती है तो मैं इसे आम तौर पर तोड़ दूंगा इसलिए मुझे अंत पढ़ने के लिए लाइन के अंत में जाना नहीं है। अधिकांश भाषाएं लाइन निरंतरता चरित्र का समर्थन करती हैं, इसलिए मुझे कोड में भौतिक रूप से इसे तोड़ने की ज़रूरत नहीं है, लेकिन मेरे पास केवल एक आदत है क्योंकि मैं कुछ भाषाओं में काम करता हूं, जिनके पास यह नहीं है।

+0

"इसे तोड़ने के शारीरिक रूप से कोड में" करने के लिए, आप अपने कंप्यूटर पंच है या सिर्फ हमें एक बहुत छोटे चुंबक? – thrashr888

6

यह कुछ ही, लघु, तार के लिए कोई फर्क नहीं पड़ता थोड़ा तेज है। जो कुछ भी पढ़ने के लिए स्पष्ट है उसका प्रयोग करें।

लेकिन यदि आपके पास बहुत सारे हैं (हजारों कहें) इतने छोटे नहीं हैं, तो आप शायद उन्हें एक सरणी में रखना और उन्हें एक साथ शामिल करना चाहते हैं। (जैसा कि ऐसा होता है, इस तरह के कोड को अक्सर "। =" का उपयोग करके तारों को संयोजित करने के रूप में पढ़ना आसान होता है, इसलिए आप प्रदर्शन की वेदी पर स्पष्टता का त्याग नहीं कर रहे हैं।)

संपादित करें: मुझे ऊपर नहीं लगता सोच वैध है। PHP के तार mutable हैं, है ना?

+0

इस पीईजेड को अनदेखा करने के लिए खेद है, लेकिन ऐसा लगता है कि यह एक अच्छा जवाब है जो दूसरों ने मददगार महसूस किया ताकि मैंने स्वतंत्रता ली। – nickf

+0

मुझे चिंता है कि लोग सोचेंगे कि यह वास्तव में सच है। जो शायद PHP के लिए नहीं है। यह मुझसे एक रीढ़ की हड्डी प्रतिक्रिया थी क्योंकि जिन भाषाओं में मैं काम करता हूं उनमें अपरिवर्तनीय तार होते हैं। – PEZ

+0

उदाहरण के लिए लूआ जैसी भाषाओं में, यह वास्तव में मामला है। हालांकि मेरी वृत्ति मुझे बताती है कि स्ट्रिंग में शामिल होने वाले सरणी से PHP को लाभ हो सकता है जब तारों का एक टन शामिल होता है - स्मृति की पुन: आवंटन के कारण, संभवतः प्रत्येक समामेलन पर। मैं बस इसे आजमाने की कोशिश कर रहा हूँ !! –

2

कुछ भी जो आप कोड में मैन्युअल रूप से संयोजित कर रहे हैं, प्रदर्शन शायद कोई फर्क नहीं पड़ता, इसलिए पठनीयता राजा है। मेरे लिए, इसका मतलब अक्सर heredoc वाक्यविन्यास का उपयोग करना है। मुझे अपनी इंडेंटेशन संरचना को तोड़ने के तरीके को पसंद नहीं है, लेकिन यह विशेष रूप से अच्छा है जब आप लाइन ब्रेक और/या टैब को अपने तारों में सही ढंग से डालना चाहते हैं।

0

एक स्ट्रिंग में बड़ी मात्रा में डेटा प्राप्त करने का सबसे तेज़ तरीका, echo'd आउटपुट को कैप्चर करने के लिए आउटपुट बफरिंग है।

ob_start(); 
/* many echos. For example, in a loop */ 
$outString = ob_get_contents(); // get the complete string 
ob_end_clean(); 

सामान्य में, यह अपने कार्यक्रम की गति के लिए एक महत्वपूर्ण फर्क है, इसलिए यह स्पष्ट तुम क्या कर रहे दिखने की संभावना नहीं है, जब से तुम वापस आने के लिए ठीक/इसे बाद में किसी भी तरह अपडेट करना होगा। पठनीयता राजा है।

+0

आप कैसे कह सकते हैं कि आउटपुट बफरिंग एकाधिक परिवर्तनीय असाइनमेंट से बेहतर है? क्या आपके पास मुझे इंगित करने के लिए php दुभाषिया के आंतरिक काम को समझाते हुए कोई पाठ है? – Eineki

+0

यह डेटा डालने के लिए बड़ी मेमोरी रिक्त स्थान आवंटित ओबी कोड के बारे में है। स्ट्रिंग को जोड़ने के लिए स्मृति आवंटन की भी आवश्यकता होती है - नई स्ट्रिंग के लिए - और इसमें समय लगता है। –

19

पीईजेड और टॉपबिट दोनों सही हैं।

$var = "line 1 \n"; 
$var .= "line 2 \n"; 

बनाम

$var = "line 1 \n" 
    . "line 2 \n"; 

मैं जितना नेत्रहीन यह स्पष्ट अपने परिणाम है पहले एक करने के लिए एक दूसरे को पसंद करते हैं: मैं बस कुछ मुझे लगता है कि बेहतर की तुलना में यहां देखा गया है लग रहा है का कहना है करना चाहते हैं एक स्ट्रिंग $ var। यह बेवकूफ कीड़े को भी रोकता है जैसे:

$var = "line 1 \n"; 
$var .= "line 2 \n"; 
$vat .= "line 3 \n"; 
$var .= "line 4 \n"; 
+3

पहले त्रुटि को नहीं देखा ... मुझे लगता है कि आपके बिंदु को साबित करता है! –

+1

मैं पहले व्यक्ति को पसंद करता हूं, क्योंकि यह ग्रहण और vim –

3

कोई फर्क नहीं पड़ता। दोनों concatenation हैं, तो जो भी पढ़ने के लिए सबसे आसान है वह है कि आप क्या उपयोग करना चाहिए।

यदि आप सर्वोत्तम प्रदर्शन करने के बाद हैं, तो एक सरणी का उपयोग करने का प्रयास करें और फिर समाप्त होने पर इसे इंपोड करें।

$var = array(); 
$var[] = "line 1\n"; 
$var[] = "line 2\n"; 
$var[] = "line 3"; 
$var = implode('', $var); 

किसी भी तरह से आप इसे करते हैं तो गति अंतर नगण्य होगा जब तक कि आप हजारों बड़े तारों के साथ काम नहीं कर रहे हों।

0

कोई सार्थक अंतर नहीं है। यह सिर्फ वरीयता कोडिंग का मामला है।

0

मेरे पास एक सरणी थी जो एक सरणी बना रही थी और फिर इम्प्लोडिंग सबसे तेज़ तरीका हो सकता है। मैं गलत था! हालांकि $ str = $ str + $ bla कर परिमाण के क्रम में वास्तव में धीमा है! यह केवल तभी मायने रखता है जब आप concatenations का एक टन कर रहे हैं। यहाँ अपने परीक्षण कोड है:

<?php 

function doit($n) { 

    $str2concat = 'Esta es una prueba. ¿Cuál manera es más rápida?'; 

    $str = ''; 

    // option 1 
    $start = microtime(true); 

    for($i=0; $i <= $n; $i++) { 
     $str .= $str2concat; 
    } 

    $end = microtime(true); 
    echo " Concat: $n Iterations, duration:" . ($end-$start) . "\n"; 

    // option 2 
    $str = ''; 
    $start = microtime(true); 

    for($i=0; $i <= $n; $i++) { 
     $str = $str . $str2concat; 
    } 

    $end = microtime(true); 
    echo "Concat2: $n Iterations, duration:" . ($end-$start) . "\n"; 

    // option 3 
    $str = []; 
    $start = microtime(true); 

    for($i=0; $i <= $n; $i++) { 
     $str[] = $str2concat; 
    } 

    $str = implode($str); 
    $end = microtime(true); 
    echo "Implode: $n Iterations, duration:" . ($end-$start) . "\n\n"; 

} 

doit(5000); 
doit(10000); 
doit(100000); 

यहाँ परिणाम है कि मुझे मिल रहे हैं:

Concat: 5000 Iterations, duration:0.0031819343566895 
Concat2: 5000 Iterations, duration:0.41280508041382 
Implode: 5000 Iterations, duration:0.0094010829925537 

Concat: 10000 Iterations, duration:0.0071289539337158 
Concat2: 10000 Iterations, duration:1.776113986969 
Implode: 10000 Iterations, duration:0.013410091400146 

Concat: 100000 Iterations, duration:0.06755805015564 
Concat2: 100000 Iterations, duration:264.86760401726 
Implode: 100000 Iterations, duration:0.12707781791687 
+0

दोनों में ऑटो-इंडेंट फ़ंक्शन के साथ संगत है, आपके परिणाम क्या हैं? –

+0

मैं अपने उत्तर में परिणाम जोड़ूंगा .... –

+0

यदि आप उन्हें अपने उत्तर में सही रखते हैं तो यह अधिक उपयोगी होगा :) –