PHP:هو أفضل سلسلة على 1 سطر أو عدة أسطر ؟ أم أن هناك فرق ؟

StackOverflow https://stackoverflow.com/questions/431569

  •  08-07-2019
  •  | 
  •  

سؤال

هل هناك فرق أو واحدة أفضل من الأخرى التالية:

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

أو

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

هل هناك فرق السرعة أم أن هناك سبب لماذا كنت اختيار واحد على الآخر ؟

هل كانت مفيدة؟

المحلول

وهناك فرق صغير إذا كنت أردد السلسلة.

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

وأسرع قليلا من

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

نصائح أخرى

وكلا PEZ وTopbit صحيحة. أنا فقط أريد أن أشير إلى شيء وأعتقد أن تبدو أفضل مما كان ينظر هنا:

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

ومقابل

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

وأنا أفضل بكثير ثانية واحدة لأول واحد كما بصريا فمن الواضح نتيجة الخاص بك هو واحد من سلسلة $ فار. كما يمنع الخلل غبية مثل:

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

لا يهم لبضع, قصيرة, سلاسل.استخدام كل ما هو أوضح من قراءة.

ولكن إذا كان لديك الكثير منهم (يقولون آلاف) لا قصيرة جدا منها, ربما كنت سوف ترغب في الاحتفاظ بها في مجموعة والانضمام إليها معا.(كما يحدث مثل هذا الرمز هو في كثير من الأحيان من السهل قراءة كما وصل السلاسل باستخدام ".=", لذلك كنت لا التضحية الوضوح على مذبح الأداء.)

تحرير:لا أعتقد بلدي أعلاه التفكير هو صالح.PHP سلاسل قابلة للتغيير ، أليس كذلك ؟

ولن تحدث فرقا. كلاهما سلسلة، لذلك كل ما هو أسهل للقراءة هو ما يجب عليك استخدام.

إذا كنت بعد أفضل أداء، حاول استخدام مجموعة وثم تنهار أنه عند الانتهاء.

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

وبأي حال من الأحوال أن تفعل ذلك الفرق سرعة ستكون ضئيلة ما لم كنت تعمل مع الآلاف من سلاسل كبيرة.

لأي شيء كنت وصل يدويا في التعليمات البرمجية، والأداء ربما لا يهم، لذلك القراءة هو الملك. بالنسبة لي، وهذا يعني في كثير من الأحيان باستخدام <لأ href = "http://us3.php.net/manual/en/language.types.string.php#language.types.string.syntax.heredoc" يختلط = "نوفولو noreferrer" > تركيب heredoc . أنا لا أحب الطريقة التي يكسر بلدي هيكل المسافة البادئة، ولكن من الجميل خصوصا عندما تريد فواصل الأسطر و / أو علامات التبويب إدراج بشكل صحيح إلى سلاسل الخاص بك.

وأنا لا أعتقد أنك ستلاحظ لمثل هذه الحالة قصيرة. أنا عادة أن تقرر لأسباب القراءة التي انا ذاهب الى استخدام. أنا تقسيم فقط على حالتين، وإلا على سطر واحد:

وأ) إنشاء استجابة متعدد الخطوط حتى رمز نوعا ما يقلد ما سيرى المستخدم. لقد وجدت أنه يجعل من السهل للقبض على الأخطاء المطبعية والأخطاء بهذه الطريقة.

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

وب) طول الخط. إذا كان الخط سوف تفيض نافذتي وأنا عادة تقسيمها لذلك أنا لم يكن لديك للذهاب الى نهاية الخط لقراءة النهاية. معظم لغات تدعم حرف متابعة الخط بحيث لا أحتاج حقا إلى كسرها فعليا في التعليمات البرمجية، ولكن مجرد عادة لدي منذ أن كنت لا تعمل في بعض اللغات التي لا تملك ذلك.

وأسرع طريقة للحصول على كمية كبيرة من البيانات في سلسلة واحدة، يتم إخراج التخزين المؤقت لالتقاط echo'd الانتاج.

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

في عام، فمن غير المرجح أن يحدث فارقا كبيرا لسرعة البرنامج، لذلك جعلها تبدو واضحة ما تقومون به، لأن لديك لأعود لإصلاح / تحديثه في وقت لاحق على أية حال. قراءة هو الملك.

وليس هناك تغيير ذي مغزى. انها مجرد مسألة الترميز تفضيل.

وكان لدي حدس بأن جعل مجموعة وثم ينهار قد يكون أسرع وسيلة. لقد كنت مخطئ! ومع ذلك القيام $ شارع = $ + $ شارع بلوخ بطيئة حقا بأمر من حجم! لا يهم فقط إذا كان لديك القيام طن من تسلسالت. وهنا قال لي رمز اختبار:

<?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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top