php: çıkış [] w / $ çıktı vs katılmak =.

10 Cevap php

Ben orijinal yazarın bu suretle bir dizi kullanarak bir web sayfası kurduğu bazı kod değiştirerek ediyorum:

 $output[]=$stuff_from_database;
 $output[]='more stuff';
 // etc
 echo join('',$output);

Herkes bu tercih (veya tersi) olacak bir neden düşünebiliyor musunuz:

 $output =$stuff_from_database;
 $output .='more stuff';
 // etc
 echo $output;

10 Cevap

Muhtemelen dizeleri iletmenin ve böylece birleştirme pahalı bir dilde gelen biri tarafından yazılmıştır. Aşağıdaki testler göstermek gibi PHP bunlardan biri değildir. Yani ikinci yaklaşım, akıllıca daha iyi performans. Ben ilk yaklaşımı kullanmak aklınıza yalnızca diğer sebebi başka bir dizinin bir kısmını değiştirmek mümkün, ama bu belirtilmemişse endeksler, takip etmek anlamına gelir.

~$ cat join.php
<?php

for ($i=0;$i<50000;$i++) {
$output[] = "HI $i\n";
}

echo join('',$output);
?>


~$ time for i in `seq 100`; do php join.php >> outjoin ; done

real    0m19.145s
user    0m12.045s
sys     0m3.216s

~$ cat dot.php
<?php

for ($i=0;$i<50000;$i++) {
$output.= "HI $i\n";
}

echo $output;
?>


~$ time for i in `seq 100`; do php dot.php >> outdot ; done

real    0m15.530s
user    0m8.985s
sys     0m2.260s

Bu biraz konu dışı, ama

$output =$stuff_from_database;
$output .='more stuff';
// etc
echo $output;

Çok daha yavaştır:

echo = $stuff_from_database;
echo 'more stuff';

Aslında, PHP bir dize oluşturmak için en hızlı yoludur:

ob_start();
echo = $stuff_from_database;
echo 'more stuff';
$output = ob_get_contents();
ob_end_clean();

Nedeniyle çıkış tamponlar çalışmak ve bu tür bu şekilde, bir dize oluşturmak için en hızlı yoldur. Eğer gerçekten çirkin ve kodun kolay okunması yol yok gibi acı bina optimize etmek gerekiyorsa Açıkçası sadece bu yapardı. Ve herkes bir "Prematüre optimizasyonu tüm kötülüklerin kökü olduğunu" bilir.

Yine, konu dışı biraz (çok uzak değil), ancak (, ',' $ çıktı) katılmak, bitiştirmek için sadece birkaç satır varsa, sonra çıkış olmak dizisi öğeler arasında bir şey koymak amacıyla olsaydı yapardı kolayca ve hızlı bir şekilde yeterince. Bu yazmak daha kolay olacaktır, ve (',' Bir sondaki istemem nerede) listenin sonuna kontrol etmek zorunda önler olacaktır.

Programcı süre için, bir cpu döngüsü daha pahalı kez 1000 mertebesinde olduğu gibi, ben genellikle sadece içine atmak istediğiniz bir saniyede 10,0000 + kez çalıştırmak olacak değilse katılın.

Bu gibi post-kodlama mikro-optimizasyon kaydedilen cpu zaman vs alınan süre açısından çok nadiren değer.

< - Önceki Yorum Redacted ->

O yüzden ben bir no-op yapıyordu benim kodda bir hata vardı ve denetlemek unuttum görünür.

It would appear Contary to previous testing, and reading previous blogs on the topic, the following conclusions are actually ( tested ) untrue at least for all variants of the above code I can permute.

  1. UNTRUE: String interpolasyon dizisi birleştirme daha yavaştır. (!)
  2. UNTRUE: sprintf hızlı.

Gerçek testlerde sprintf'i olan slowest ve interpolasyon olan fastest

PHP 5.2.6-pl7-gentoo (cli) (built: Sep 21 2008 13:43:03) 
Copyright (c) 1997-2008 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2008 Zend Technologies
    with Xdebug v2.0.3, Copyright (c) 2002-2007, by Derick Rethans

Benim kurulum için şartlı olabilir, ama yine de garip olabilir. :/

Bunu yapmak için en hızlı yoldur yankıları olduğunu düşünüyorum. Bu okunabilirlik maliyet değerinde olduğu gibi güzel ve muhtemelen yeterince hızlı değil.

echo $stuff_from_database
   , 'more stuff'
   , 'yet more'
   // etc
   , 'last stuff';

Ben üst sadece bir dizideki her parça saklamak ve daha sonra sonunda hepsini katılacak inanıyoruz ise alt, defalarca $ çıktı dize yeniden tahsis edecek. Orijinal örnek bir sonucu olarak hızlı olarak sona erebilir. Bu performans hassas değilse, o zaman muhtemelen katılmak değil, append olacaktır.

Implode () ile katıldı veya katılmak durumunda () PHP daha iyi olduğunu optimize edebiliyor. Bu listedeki tüm dizeleri geçer, uzunluğunu hesaplar ve gerekli alanı ayırır ve boşluk doldurur. Dize için ". =" O (sürekli ücretsiz vardır) ve malloc () alanı ile karşılaştırıldığında.

Kodun bu bölümü performansa duyarlı değildir; bir düşük-trafik web sitesinde bir kullanıcının alışveriş sepeti bilgileri biçimlendirmek ve görüntülemek için kullanılır. Ayrıca, array (veya dize) sıfırdan her zaman inşa edilmiştir ve adresi veya belirli öğeleri aramak için gerek yoktur. Dizi biraz daha etkili gibi geliyor, ama bu kullanım için ya da bir önemi yok sanırım. Tüm bilgi için teşekkürler!

Bir liste (örneğin bir alışveriş sepeti) üreten ediyorsanız, size veritabanından getirilen her giriş HTML üretir bazı kod olmalıdır.

for ($prod in $cart)
{
  $prod->printHTML();
}

Ya da böyle bir şey. Bu şekilde, kod çok temiz olur. Tabii ki, bu oldukça benim şirket yapar (ve yerini) gibi bir bütün zekâlı karmaşa daha nesnelerle güzel bir kod var olduğunu varsayar.

Zaten söylenmiştir, ama ben farklı bir cevap yardımcı olacağını düşünüyorum.

O daha hızlı olduğunu düşündüm, çünkü orijinal programcı bu şekilde yazdı. Aslında, PHP 4 altında, gerçekten özellikle büyük dizeleri için, daha hızlı oldu.