Hız PHP5'ta birleştirme vs inline dizeleri kullanarak fark?

12 Cevap php

Düşünün (php5 varsayalım)

<?php
$foo = 'some words';

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

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

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

1 ve 2 arasında bir çok fark var mı?

Eğer değilse, ne 1/2 ile 3 arasında yaklaşık?

12 Cevap

Peki, gibi tüm sorulara "gerçek hayat daha hızlı olabilir ne", gerçek bir yaşam testi yenemezsin.

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";

Sonra, sayfa her şeyi o birkaç çalışır verin ...

0.0035568

0.0035388

0.0025394

Yani, beklendiği gibi, enterpolasyon (muhtemelen enterpolasyon motor işlemek gerekiyor ekstra karakter, gürültü seviyesi farklılıkları) hemen hemen aynıdır. Kadar düz birleştirme hiçbir büyük şok hızı, yaklaşık% 66 olduğunu. Enterpolasyon ayrıştırıcı, bakmak ilgisi bulmak, daha sonra basit bir iç dize concat ile tamamlanacak. Concat pahalı olsa bile, interpolator hala after tüm iş değişkeni dışarı ayrıştırmak ve / özgün dize kadar kopyalamak trim, bunu yapmak zorunda olacak.

Performans farkı irrelevant en azından Ocak 2012 tarihinden itibaren yapılmış ve büyük olasılıkla daha erken etti:

Single quotes: 0.061846971511841 seconds
Double quotes: 0.061599016189575 seconds

PHP'nin önceki sürümlerinde bir fark olmuş olabilir - Ben şahsen çift tırnak tek tırnak tercih, bu yüzden uygun bir fark oldu. Makalenin sonuç mükemmel bir nokta yapar:

Kendinizi sahte vermedi bir istatistik asla güvenme.

Makale ifade tırnak rağmen (, özgün espri muhtemel yanlış attributed Winston Churchill, bir yalancı olarak Churchill göstermeye Joseph Goebbels'in propaganda bakanlığı tarafından icat:

Ich Traue keiner Statistik, ich nicht selbst gefälscht habe die.

Bu gevşek, "Ben kendimi sahte değil mi bir istatistik güvenmiyorum." Çevirir)

Canlı kriterler:

http://phpbench.com/

Çift tırnak vs ile tek değişkenleri birleştirerek zaman ince bir fark aslında yoktur.

@ Adem testi kullanıldı

"these are " . $foo

Aşağıdaki daha hızlı olduğuna dikkat:

'these are ' . $foo;

Bu gibi tek tırnaklı 'string' sadece alınır nerede bir çift tırnaklı "string", değerlendirilir alır, gerçeği nedeniyle ...

Çok PHP string işlemleri optimize çalışırken yakalanmak etmeyin. Veritabanı sorguları kötü yazılmış veya önbelleğe alma düzeni her türlü kullanarak değilse enterpolasyon vs ulama (gerçek dünya performansı) anlamsızdır. Daha sonra kod hata ayıklama kolay olacak böyle bir şekilde dize yazma işlemleri, performans farklılıklar önemsizdir.

@ Bu dil minutia hakkında sadece bir soru varsayarsak uberfuzzy, ben iyiyim sanırım. Ben sadece anlamsız gerçek dünya uygulamalarında tek tırnak, çift teklifi ve yorumlu metin arasındaki performansını karşılaştıran bu tür kötü veritabanı sorgularını gibi gerçek performans lavabolar, kıyasla konuşma eklemek için çalışıyorum.

Yürütme zaman içinde herhangi bir farklılık tamamen ihmal vardır.

Bakınız

Bu gibi mikro-optimizasyonlar üzerinde zaman kaybetmeyin. Bir gerçek dünya senaryoda uygulamanızın performansını ölçmek ve gerçekten ihtiyaç duyulan yere daha sonra optimize etmek için bir profiler kullanın. Tek bir özensiz DB sorgu optimizasyonu tüm kod üzerinde mikro-optimizasyon uygulayarak daha büyük bir performans artışı yapmak olasıdır.

Ben forum yazılım geliştiricisi, Vanilya tek tırnak ile kendi kodu içinde tüm çift tırnak yerini ve performans artışı makul bir fark olduğunu hatırlar gibiyim.

Ama şu anda tartışma bir bağlantı izini görünmüyor olabilir.

Orada ... değişkenleri birleştirerek ve sonucu ne yaptığını ne zaman bir fark olduğunu ... ve ne yapıyorsun çıktı damping ise, veya üzerinde çıktı tamponlama değildir.

Ayrıca, sunucunun hafıza durumu nedir? genellikle daha yüksek bir düzey platformda bellek yönetimi düşük platformlarda daha kötüdür ...

$a = 'parse' . $this; 

kullanıcı kodu platform seviyesinde yöneten bellek ...

$a = "parse $this";

php sistemi kodu platform seviyesinde yöneten bellek ...

böylece CPU ile ilgili olarak, bu kriterler tam hikaye söyleme.

aynı anda aynı Simülasyon 1.000 kez çalıştırmak için çalışıyor bir sunucu üzerinde kriter 1000 kere çalıştıran vs kriter 1000 kere çalışan ... Eğer uygulamanın kapsamına göre önemli ölçüde farklı sonuçlar alabilirsiniz.

Çift tırnak çok daha yavaş olabilir. Ben bunu yapmak için daha iyi olduğunu çeşitli yerlerde okumak

'parse me '.$i.' times'

göre

"parse me $i times"

Ben söyleyebilirim rağmen ikinci bir sen daha okunabilir kod verdi.

Hemen hemen hiç fark yoktur! Zamanlamaları bakınız: http://micro-optimization.com/single-vs-double-quotes

Sadece bir çift tırnaklı dize sözdizimi içinde bir değişken kullanıyorsanız, karıştırmak için başka bir şey eklemek için:

$foo = "hello {$bar}";

daha hızlı

$foo = "hello $bar";

ve bunların her ikisi de daha hızlıdır

$foo = 'hello' . $bar; 

Hislerim değişken değeri bulmak ve alt dizenin içeriğini ayrıştırma gerektirmez sadece çünkü eğer birleştirme, daha hızlı olacağını söylüyor. Gerçek bir hız farkı varsa, olsa, ben benim kendi kodunu asla fark ettik.

Onlar gerekli olduğunda 1 ve 2 gelince, ben dize enterpolasyon için kıvırcık parantez kullanmak gerekir sadece zaman bir dizi elemanı erişen veya nesneye birden fazla derin gidiyoruz zaman bildiğim kadarıyla, olan, bir böylece gibi sözdizimi:

$dog->innards->spleen