Anda tidak dapat secara retrospektif menghitung footprint variabel yang tepat karena dua variabel dapat berbagi ruang yang dialokasikan sama di memori
Mari kita coba membagi memori antara dua larik, kita melihat bahwa mengalokasikan larik kedua menghabiskan setengah dari memori larik pertama. Saat kami membatalkan setelan yang pertama, hampir semua memori masih digunakan oleh yang kedua.
echo memory_get_usage()."\n"; // <-- 433200
$c=range(1,100);
echo memory_get_usage()."\n"; // <-- 444348 (+11148)
$d=array_slice($c, 1);
echo memory_get_usage()."\n"; // <-- 451040 (+6692)
unset($c);
echo memory_get_usage()."\n"; // <-- 444232 (-6808)
unset($d);
echo memory_get_usage()."\n"; // <-- 433200 (-11032)
Jadi kita tidak bisa menyimpulkan daripada array kedua menggunakan setengah memori, karena menjadi salah ketika kita membatalkan yang pertama.
Untuk gambaran lengkap tentang bagaimana memori dialokasikan dalam PHP dan untuk kegunaan apa, saya sarankan Anda untuk membaca artikel berikut: Seberapa besar array (dan nilai) PHP sebenarnya? (Petunjuk: BESAR!)
The Dasar Referensi Counting dalam dokumentasi PHP juga memiliki banyak informasi tentang penggunaan memori, dan referensi menghitung sampai segmen data bersama.
Solusi berbeda yang diekspos di sini bagus untuk perkiraan tetapi tidak ada yang dapat menangani manajemen halus memori PHP.
- menghitung ruang yang baru dialokasikan
Jika Anda menginginkan ruang yang baru dialokasikan setelah tugas, maka Anda harus menggunakan memory_get_usage()
sebelum dan sesudah alokasi, karena menggunakannya dengan salinan memberi Anda pandangan yang salah tentang kenyataan.
// open output buffer
echo "Result: ";
// call every function once
range(1,1); memory_get_usage();
echo memory_get_usage()."\n";
$c=range(1,100);
echo memory_get_usage()."\n";
Ingatlah bahwa jika Anda ingin menyimpan hasil pertama memory_get_usage()
, variabel harus sudah ada sebelumnya, dan memory_get_usage()
harus dipanggil lain waktu sebelumnya, dan setiap fungsi lainnya juga.
Jika Anda ingin menggemakan seperti pada contoh di atas, buffer keluaran Anda harus sudah dibuka untuk menghindari memori akuntansi yang diperlukan untuk membuka buffer keluaran.
- menghitung ruang yang dibutuhkan
Jika Anda ingin mengandalkan fungsi untuk menghitung ruang yang diperlukan untuk menyimpan salinan variabel, kode berikut menangani pengoptimalan yang berbeda:
<?php
function getMemorySize($value) {
// existing variable with integer value so that the next line
// does not add memory consumption when initiating $start variable
$start=1;
$start=memory_get_usage();
// json functions return less bytes consumptions than serialize
$tmp=json_decode(json_encode($value));
return memory_get_usage() - $start;
}
// open the output buffer, and calls the function one first time
echo ".\n";
getMemorySize(NULL);
// test inside a function in order to not care about memory used
// by the addition of the variable name to the $_GLOBAL array
function test() {
// call the function name once
range(1,1);
// we will compare the two values (see comment above about initialization of $start)
$start=1;
$start=memory_get_usage();
$c=range(1,100);
echo memory_get_usage()-$start."\n";
echo getMemorySize($c)."\n";
}
test();
// same result, this works fine.
// 11044
// 11044
Perhatikan bahwa ukuran nama variabel penting dalam memori yang dialokasikan.
- Periksa kode Anda !!
Variabel memiliki ukuran dasar yang ditentukan oleh struktur C bagian dalam yang digunakan dalam kode sumber PHP. Ukuran ini tidak berfluktuasi dalam hal angka. Untuk senar, itu akan menambah panjang senar.
typedef union _zvalue_value {
long lval; /* long value */
double dval; /* double value */
struct {
char *val;
int len;
} str;
HashTable *ht; /* hash table value */
zend_object_value obj;
} zvalue_value;
Jika kita tidak memperhitungkan inisialisasi nama variabel, kita sudah tahu berapa banyak variabel yang digunakan (dalam hal angka dan string):
44 byte dalam kasus angka
+ 24 byte untuk string
+ panjang string (termasuk karakter NUL terakhir)
(angka-angka itu bisa berubah tergantung pada versi PHP)
Anda harus membulatkan hingga kelipatan 4 byte karena penyelarasan memori. Jika variabel berada di ruang global (bukan di dalam fungsi), itu juga akan mengalokasikan 64 byte lagi.
Jadi jika Anda ingin menggunakan salah satu kode di dalam halaman ini, Anda harus memeriksa apakah hasilnya menggunakan beberapa kasus uji sederhana (string atau angka) cocok dengan data tersebut dengan mempertimbangkan setiap indikasi dalam posting ini (array $ _GLOBAL, panggilan fungsi pertama, buffer keluaran, ...)