Özyinelemeyi işlemek için PHP'nin yeteneği

2 Cevap php

Ben PHP yineleme için kötü bir kapasiteye sahip olduğunu söyleyen insanlar son zamanlarda bir kaç yerde gördüm. Geçenlerde grafik geçişi için bir özyinelemeli php fonksiyon yazdım ve java kıyasla çok yavaş bulundu. Ben php genel java daha yavaştır, çünkü, çünkü yineleme ya da için php kapasitesinin olup olmadığını bilmiyorum.

Bazı googling bu ortaya çıkardı (http://bugs.php.net/bug.php?id=1901)

Cvs de [7 Ağustos 1999 12:25 UTC] zeev php nokta net nokta

PHP 4.0 (Zend) uses the stack for intensive data, rather than using the heap. That means that its tolerance recursive functions is significantly lower than that of other languages.

It's relatively easy to tell Zend not to use the stack for this data, and use the heap instead - which would greatly increase the number of recursive functions possible - in the price of reduced speed. If you're interested in such a setting, let me know, we may add a compile-time switch.

Ne php yoğun veri yığın kullanır söylemek demek? Php bir çalışma zamanı yığın kurmak değil mi? Ayrıca, php recursion diğer dillere göre çok daha yavaş olduğunu, genel olarak doğrudur? Ve tarafından ne kadar?

Teşekkürler!

2 Cevap

Tamam, ben de bir deneyeceğim.

Birincisi: "yığın" standart C / C + + tipi programlarında izleme işlev çağrısı için kullanılan alandır. Bu işletim sistemi ve programlama dili sözleşmeler bellekte tanımlamak ve bir stack (veri yapısı) gibi tedavi olan bir yerdir. Eğer bir C fonksiyonunu çağırdığınızda fibbonaci(int i) o i değişkeni yerleştirir, ve zaten yığını üzerinde, onu çağıran meşgul işlevin dönüş adresi. Bazı bellek alır. Bu işlev çağrısı ile bittiğinde, bellek yeniden kullanılabilir. Yığın sonlu boyutta olduğunu. Bunu çok büyük değişkenleri depolamak ve birçok özyineli iseniz, o zaman oda tükendi olabilir. Değil mi?

Yani .....

Öbek üzerinde (daha genel alanından bellek istemek için) ve yığını üzerinde ve yığını çünkü şeyler programlanmış şekilde onları daha verimli bir yerdir: Anlaşılan Zend veri tahsis etmenin iki yolu vardır. (Neden bilmiyorum, ama tahmin edebiliyorum çok düşük seviye önbelleğe alma endişeleri olabilir -. Ben yığın yığın keyfi bellek olacağını daha L1 ya da L2 önbellek olması ihtimalini bekliyoruz, CPU çünkü çok sık o bölgede kullanıyor olması çok muhtemeldir -. Eğer bir işlevi çağırmak, her zaman, aslında aynı zamanda yığın veri erişimi için tahsis havai olabilir).

Bu bağlamda "Yoğun" data, ben inanıyorum, çok yakında ya da çok sık kullanılan çok muhtemeldir veriler anlamına gelir. Bu değişkenler için hızlı yığın tabanlı tahsisini kullanmak mantıklı olacaktır. Eğer çok hızlı bir şekilde kullanarak bazı değişkenlerin ne çeşit? Peki, nasıl bir işleve parametre hakkında? O kullanımı çok olasıdır: aksi halde neden hç rahatsız olurdu? (- Ki diğer şeyler arasında kopyalama yükü verir, çünkü büyük veri yapıları ziyade büyük veri yapıları kendileri için başvurular) Onlar küçük veri öğeler olmak da muhtemelen ihtimalini demektir. Yani yığın muhtemelen çoğu PHP programcıları için PHP fonksiyon parametrelerini depolamak için mantıklı ... ama özyineleme er başarısız olur.

Umarım cevaplar en azından "bu ne demek?" Söyledi. Lütfen özyineleme performans soru için: Kendiniz kriter git; muhtemelen yapmak için çalışıyoruz özyineleme ne tür bağlıdır.

Bir tahmin, ben senin sorunun başka özyineleme kendisinden daha yattığını söyleyebilirim. Birçok şey için, Java, PHP çok daha hızlıdır. PHP'nin performansını artırmak için yollar, tür, vardır.

Ancak, PHP yığının dışında çalışan ve korkunç 'yığın taşması' mesajı ile, çökmesini PHP özyineleme sınırlama sonuçları (cinas çeşit amaçlanan). Bu noktada, programı yürütmek için sona erer.

PHP dinamik bir yığın kullanıyor ise, nedeniyle bellek daha büyük bir blok yığını realloc için gereken zaman bazı (hafif) yavaşlama görebiliyordu.

Her neyse, ben bir yaşam için yapmam şeydir performans sorunu saptamak için ne yaptığınızı hakkında biraz daha bilmek gerekir ki ...