Probé el uso de memoria de algunas variables simples y encontré resultados inesperados, consulte este código:
$datetimes = []; $memory_before = memory_get_usage(); for ($x = 0; $x < 1000; $x++) { $datetimes[] = new \DateTime(); } var_dump('DateTimes: ' . (memory_get_usage() - $memory_before)); $ints = []; $memory_before = memory_get_usage(); for ($x = 0; $x < 1000; $x++) { $ints[] = $x; } var_dump('Integers: ' . (memory_get_usage() - $memory_before));Obtengo esta salida (en PHP 7.4, 64 bits):
string(17) "DateTimes: 350504" string(15) "Integers: 37160"37 KB de memoria para 1000 ints no tiene sentido para mí, ¿verdad? Esperaría 8000 bytes más algunos gastos generales de matriz.
Mi experimento escala: por un millón de entradas, obtengo un uso de memoria de 33558808 bytes.
He deshabilitado xdebug.
Es cómo funciona PHP y la desventaja de tener variables de tipo dinámico.
El entero es en realidad un objeto Zend .
1000 x (64 * 2) = 128 Kbit por lo que 16 KB.
Agregue a eso la matriz de tamaño 1000.
En la memoria, zval se representa como dos palabras de 64 bits. La primera palabra mantiene el valor, y la segunda palabra mantiene los campos tipo, type_flags, extra y reservados.