memory_get_usage

4 Cevap php

I'm making a little benchmark class to display page load time and memory usage. Load time is already working, but when I display the memory usage, it doesn't change Example:

$conns = array();
ob_start();
benchmark::start();
$conns[] = mysql_connect('localhost', 'root', '');
benchmark::stop();
ob_flush();

aynı bellek kullanır

$conns = array();
ob_start();
benchmark::start();
for($i = 0; $i < 1000; $i++)
{
   $conns[] = mysql_connect('localhost', 'root', '');
}
benchmark::stop();
ob_flush();

Ben bayt bellek kullanımı almak için memory_get_usage (true) kullanıyorum.

4 Cevap

memory_get_usage(true) aslında komut dosyası tarafından kullanılan değil php motoru tarafından ayrılan bellek miktarını gösterir. Bu test script daha fazla bellek için sormak için motor gerekli olmadığını çok mümkün.

Bir test için, bir büyük (imsi) dosya yakala ve belleğe okumak. Eğer bir değişiklik daha sonra görmelisiniz.

Ben başarıyla memory_get_usage(true) web tarama komut bellek kullanımını izlemek için kullanılan ettik ve (hedef sistem bellek sınırını isabet önce şeyleri yavaşlatmaya beri) o amele para cezası oluyor. Hatırlanması gereken tek şey, gerçek kullanıma göre değişiklik olmamasıdır, bu motor tarafından talep belleğe dayalı değişir. So what you end up seeing is sudden jumps instead of slowing growing (or shrinking).

Ancak, bu sistemden talep edilir bellek php gerçek miktarını izlemenize yardımcı olmaz - false If you set the real_usage bayrak, çok küçük bir bellek değişiklikleri görmek mümkün olabilir.

(Update:. Anlattığım fark bellek engine requested to run your script Hepsi aynı komut, farklı yol ve karşılaştırıldığında, the variables of your script tarafından kullanılan bellek arasında açık olmak ölçme.)

PHP'nin içlerinde hiçbir Guru değilim, ama sadece müşteriye bir şeyler verir gibi, bir echo PHP tarafından kullanılan bellek miktarını etkilemez düşünebiliriz.

Çıktı tamponlama etkinleştirmek eğer farklı olabilir.

Aşağıdaki bir fark yapmak gerekir:

$result = null;
benchmark::start()
for($i = 0; $i < 10000; $i++)
{
   $result.='test';
}

Bak:

for($i = 0; $i < 1000; $i++)
{
   $conns[] = mysql_connect('localhost', 'root', '');
}

100.000 olarak döngüye olabilir ve hiçbir şey, onun aynı bağlantı değişmiş olurdu. Onları hatırlamak bağlantılı liste büyüdü asla yok, çünkü kaynaklar bunun için tahsis edilmiştir. Neden büyümek istiyorsunuz? $conns[0] de (assumingly) geçerli tanıtıcı zaten var. It) (memory_get_usage bir fark yapmaz. Sen $conns[15] Test eğer o amele görmek, evet mi?

Kök olabilir @ localhost birden şifreler var? Eğer bunu söyledim sırf No Neden PHP başka bir bağlantısı işlemek için rahatsız olur? (tongue in cheek).

I Valgrind gerçek yığın kullanımını görmek için aracılığıyla CLI üzerinden aynı şeyi çalıştıran öneririz:

valgrind /usr/bin/php -f foo.php .. ya da benzer bir şey. Altında, iş yerinde serbest ve çöp toplama ne tahsis ne görürsünüz.

Yasal Uyarı: PHP internals yolumu biliyorum, ama ben Zend PHP aramalar C ile yazılmış olduğunu bilerek karartılmış labirent hiçbir uzman değilim.

yankı bayt tahsis numarasını değiştirmek olmaz (kullandığınız sürece output buffers).

$ i-değişken için döngü, ya ayrılan bayt sayısını değiştirerek değil bu yüzden sonra tanımsız ediliyor.

Bir çıkış tamponlama örnek kullanmayı deneyin:

ob_start();
benchmark::start();
for($i = 0; $i < 10000; $i++)
{
   echo 'test';
}
benchmark::stop();
ob_flush();