فرق السرعة في استخدام مضمنة سلاسل مقابل سلسلة في php5?

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

  •  08-06-2019
  •  | 
  •  

سؤال

(نفترض php5) النظر في

<?php

    $foo = 'some words';

    //case 1
    print "these are $foo";

    //case 2
    print "these are {$foo}";

    //case 3
    print 'these are ' . $foo;
?>

هناك الكثير من الفرق بين 1 و 2?

إن لم يكن, ما بين 1/2 و 3 ؟

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

المحلول

كما مع كل "ما قد يكون أسرع في الحياة الحقيقية" الأسئلة, لا يمكنك الفوز الحقيقي اختبار الحياة.

function timeFunc($function, $runs)
{
  $times = array();

  for ($i = 0; $i < $runs; $i++)
  {
    $time = microtime();
    call_user_func($function);
    $times[$i] = microtime() - $time;
  }

  return array_sum($times) / $runs;
}

function Method1()
{ 
  $foo = 'some words';
  for ($i = 0; $i < 10000; $i++)
    $t = "these are $foo";
}

function Method2()
{
  $foo = 'some words';
  for ($i = 0; $i < 10000; $i++)
    $t = "these are {$foo}";
}

function Method3()
 {
  $foo = 'some words';
  for ($i = 0; $i < 10000; $i++)
    $t = "these are " . $foo;
}

print timeFunc('Method1', 10) . "\n";
print timeFunc('Method2', 10) . "\n";
print timeFunc('Method3', 10) . "\n";

تعطيه بضع يمتد إلى صفحة في كل شيء ، ثم...

0.0035568

0.0035388

0.0025394

لذلك ، كما هو متوقع ، الاستيفاء متطابقة تقريبا (مستوى الضجيج الخلافات ، وربما يرجع ذلك إلى الأحرف الزائدة الاستيفاء المحرك يحتاج إلى التعامل مع).مباشرة سلسلة حوالي 66% من السرعة التي لا صدمة كبيرة.الاستيفاء محلل سوف ننظر ، تجد أن تفعل شيئا ، ثم الانتهاء مع الداخلية بسيطة سلسلة concat.حتى لو كان concat كانت باهظة الثمن ، interpolator سوف لا يزال لديك للقيام بذلك ، بعد كل عمل تحليل الخروج متغير وتقليم/نسخ تصل السلسلة الأصلية.

التحديثات عن طريق Somnath:

أضفت Method4() أعلاه في الوقت الحقيقي المنطق.

function Method4()
 {
  $foo = 'some words';
  for ($i = 0; $i < 10000; $i++)
    $t = 'these are ' . $foo;
}

print timeFunc('Method4', 10) . "\n";

Results were:

0.0014739
0.0015574
0.0011955
0.001169

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

نصائح أخرى

الفارق في الأداء وقد ذات صلة على الأقل منذ كانون الثاني / يناير 2012 ، وعلى الأرجح في وقت سابق:

Single quotes: 0.061846971511841 seconds
Double quotes: 0.061599016189575 seconds

الإصدارات السابقة من PHP قد يكون الفرق - أنا شخصيا أفضل واحد يقتبس إلى التنصيص ، لذلك كان مناسب الفرق.ختام المقال يجعل نقطة ممتازة:

لا تثق أبدا إحصائية لم تزوري نفسك.

(على الرغم من أن المادة ونقلت العبارة ، الأصلي الساخر كان من المرجح زورا يعزى إلى ونستون تشرشل ، اخترعها جوزيف غوبلز' الدعاية وزارة لتصوير تشرشل بأنه كاذب:

Ich traue keiner Statistik, يموت ich nicht selbst gefälscht habe.

هذا يترجم إلى "أنا لا أثق إحصائية أنني لم وهمية نفسي.")

يعيش المعايير:

http://phpbench.com/

هو في الواقع هناك فرق دقيق عندما وصل المتغيرات مع واحد مقابل علامات الاقتباس المزدوجة.

@آدم اختبار يستخدم

"these are " . $foo

علما بأن التالية حتى أسرع:

'these are ' . $foo;

هذا ويرجع ذلك إلى حقيقة, أن ضعف نقلت "السلسلة" يحصل على تقييم ، حيث واحد نقلت 'سلسلة' هو مجرد تؤخذ كما هي...

لا ننشغل جدا على محاولة تحسين سلسلة عمليات في PHP.سلسلة مقابلالاستيفاء لا معنى له (في العالم الحقيقي الأداء) إذا كانت قاعدة البيانات الخاصة بك الاستفسارات سيئة مكتوبة أو كنت لا تستخدم أي نوع من التخزين المؤقت للمخطط.كتابة سلسلة عمليات في مثل هذه الطريقة أن تصحيح التعليمات البرمجية الخاصة بك في وقت لاحق سوف تكون سهلة ، وأداء الفروق تكاد لا تذكر.

@uberfuzzy على افتراض أن هذا هو مجرد سؤال عن اللغة التفاصيل التافهة ، أعتقد أنه بخير.أنا فقط أحاول إضافة إلى المحادثة التي مقارنة الأداء بين واحد-اقتباس مزدوجة اقتباس heredoc في تطبيقات العالم الحقيقي في معنى مقارنة الأداء الحقيقي المصارف ، مثل سوء استعلامات قاعدة البيانات.

أي اختلافات في وقت التنفيذ هي تافهة تماما.

يرجى الاطلاع

لا تضيعوا الوقت على الصغرى تحسينات مثل هذا.استخدام منشئ ملفات التعريف لقياس أداء التطبيق الخاص بك في العالم الحقيقي السيناريو ومن ثم الأمثل حيث هناك حاجة حقا.تحسين واحدة قذرة DB الاستعلام من المرجح أن تجعل أكبر تحسين الأداء من تطبيق الصغرى أمثلية جميع أنحاء التعليمات البرمجية الخاصة بك.

أتذكر أن المطور من منتدى البرامج, الفانيليا استبدال علامات الاقتباس المزدوجة في هذا القانون مع علامات الاقتباس المفردة و لاحظت كمية معقولة من زيادة في الأداء.

أنا لا يمكن أن يبدو لتعقب رابط النقاش في هذه اللحظة على الرغم من.

هناك فرق عندما وصل المتغيرات...و ماذا كنت تفعل مع النتيجة...وإذا ما تقومون به هو الإغراق إلى الإخراج ، أو لم يكن التخزين المؤقت الإخراج على.

أيضا ، ما هو الوضع الذاكرة من الخادم ؟ عادة إدارة الذاكرة على مستوى أعلى منصة هو أسوأ من ذلك في انخفاض منصات...

$a = 'parse' . $this; 

إدارة الذاكرة في رمز المستخدم منصة مستوى...

$a = "parse $this";

إدارة الذاكرة في php رمز نظام منصة مستوى...

حتى هذه المعايير ذات الصلة إلى وحدة المعالجة المركزية لا تحكي القصة كاملة.

تشغيل مؤشر 1000 مرة مقابل تشغيل المؤشر 1000 مرة على الملقم الذي تحاول تشغيل نفس محاكاة 1000 مرة بالتزامن...قد تحصل على نتائج مختلفة بشكل جذري حسب نطاق التطبيق.

علامات الاقتباس المزدوجة يمكن أن يكون أبطأ بكثير.قرأت من عدة أماكن أن ذلك فمن الأفضل أن تفعل هذا

'parse me '.$i.' times'

من

"parse me $i times"

على الرغم من أنني أقول ثانية واحدة أعطيتك أكثر قابلية للقراءة رمز.

فقط إضافة شيء آخر إلى المزيج ، إذا كنت تستخدم متغير داخل مزدوجة سلسلة مقتبسة الجملة:

$foo = "hello {$bar}";

هو أسرع من

$foo = "hello $bar";

و كل من هذه هي أسرع من

$foo = 'hello' . $bar; 

عمليا لا يوجد فرق على الإطلاق!ترى الأوقات: http://micro-optimization.com/single-vs-double-quotes

وتجدر الإشارة إلى أنه عند استخدام نسخة معدلة من المثال آدم رايت مع 3 متغيرات النتائج عكس الأولين وظائف هي في الواقع أسرع باستمرار.هذا مع PHP 7.1 على CLI:

function timeFunc($function, $runs)
{
    $times = array();

    for ($i = 0; $i < $runs; $i++)
    {
        $time = microtime();
        call_user_func($function);
        @$times[$i] = microtime() - $time;
    }

    return array_sum($times) / $runs;
}

function Method1()
{ 
    $foo = 'some words';
    $bar = 'other words';
    $bas = 3;
    for ($i = 0; $i < 10000; $i++)
         $t = "these are $foo, $bar and $bas";
}

function Method2()
{
    $foo = 'some words';
    $bar = 'other words';
    $bas = 3;
    for ($i = 0; $i < 10000; $i++)
         $t = "these are {$foo}, {$bar} and {$bas}";
}

function Method3()
{
    $foo = 'some words';
    $bar = 'other words';
    $bas = 3;
    for ($i = 0; $i < 10000; $i++)
         $t = "these are " . $foo . ", " . $bar . " and " .$bas;
}

print timeFunc('Method1', 10) . "\n";
print timeFunc('Method2', 10) . "\n";
print timeFunc('Method3', 10) . "\n";

لقد حاولت أيضا مع '3' بدلا من مجرد عدد صحيح 3 ، ولكن يمكنني الحصول على نفس النوع من النتائج.

مع $بس = 3:

0.0016254
0.0015719
0.0019806

مع $بس = '3':

0.0016495
0.0015608
0.0022755

وتجدر الإشارة إلى أن هذه النتائج تختلف للغاية (أحصل على نماذج من حوالي 300%) ، ولكن المتوسطات يبدو نسبيا ثابتة تقريبا (9 من أصل 10 حالات) تظهر دائما أسرع التنفيذ 2 أساليب الأولى ، مع الطريقة 2 دائما أسرع قليلا من طريقة 1.

في الختام:ما هو صحيح بالنسبة 1 عملية واحدة (سواء كان الاستيفاء أو سلسلة) ليس صحيحا دائما عن العمليات المشتركة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top