Bir değişkenin bellek ayak izi (boyut) nasıl belirlenir?

7 Cevap php

Belirli bir değişken kullanır ne kadar bellek bulmak için PHP bir işlev (ya da bir PHP uzantısı) var mı? sizeof bana elemanları / özelliklerinin sayısını söyler.

EDIT: memory_get_usage bana whole komut dosyası tarafından kullanılan bellek boyutunu verir yardımcı olur. Tek bir değişken için bunu yapmak için bir yolu var mı?

7 Cevap

Orada bir tek değişkenin bellek kullanımını almak için doğrudan bir yol var, ama Gordon önerdiği gibi, sen memory_get_usage kullanabilirsiniz. Bu ayrılan toplam bellek miktarını dönecektir, bu yüzden tek bir değişkenin kullanımı almak için önce ve sonra bir çözüm kullanmak ve kullanımını ölçmek olabilir. Bu biraz hacky, ama çalışması gerekir.

$start_memory = memory_get_usage();
$foo = "Some variable";
echo memory_get_usage() - $start_memory;

Bu hiçbir şekilde güvenilir bir yöntem olduğunu unutmayın, siz değişken atarken başka bir şey bellek dokunur emin olamaz, yani bu sadece bir yaklaşım olarak kullanılmalıdır.

Aslında fonksiyon içinde değişken bir kopyasını oluşturma ve kullanılan hafıza ölçerek bir fonksiyonu olduğunu açabilirsiniz. Bu test değil, ancak ilke olarak, ben yanlış bir şey görmüyorum:

function sizeofvar($var) {
    $start_memory = memory_get_usage();
    $tmp = unserialize(serialize($var));
    return memory_get_usage() - $start_memory;
}

Tatu Ulmanens cevap cevap olarak:

Bu $start_memory kendisi bellek alacağını, unutulmamalıdır (PHP_INT_SIZE * 8).

Yani bütün fonksiyon haline gelmelidir:

function sizeofvar($var) {
    $start_memory = memory_get_usage();
    $var = unserialize(serialize($var));
    return memory_get_usage() - $start_memory - PHP_INT_SIZE * 8;
}

Maalesef ekstra bir cevap olarak bu eklemek, ama henüz bir cevap üzerinde yorum yapamam.

Ben benzer bir sorun vardı, ve ben kullanılan solüsyon bir dosyaya değişken yazmak oldu sonra bunun üzerine () dosya boyutu çalıştırın. Kabaca böyle (denenmemiş kodu):

function getVariableSize ( $foo ) 
{
    $tmpfile = "temp-" . microtime(true) . ".txt";
    file_put_contents($tmpfile, $foo);
    $size = filesize($tmpfile);
    unlink($tmpfile);
    return $size;
}

Bu disk GÇ içerir, ama bu size memory_get_usage hileler çok daha kesin bir şey vermek gerektiğini, çünkü bu çözüm korkunç hızlı değildir. Bu sadece size gereken ne kadar hassasiyet bağlıdır.

Çalıştı, ama Xdebug xdebug.collect_assignment s yeterli olabilir ile izleri asla.

Sen bir geri arama dönüş değeri bellek farkı hesaplamak için tercih olabilir. PHP 5.3 + bulunan daha zarif bir çözüm.

function calculateFootprint($callback) {
    $startMemory = memory_get_usage();
    $result = call_user_func($callback);
    return memory_get_usage() - $startMemory;
}

$memoryFootprint = calculateFootprint(
    function() {
        return range(1, 1000000);
    }
);

echo ($memoryFootprint / (1024 * 1024)) . ' MB' . PHP_EOL;