2012-08-06 20 views
10

Estoy probando la SplFixedArray la construcción de una matriz con los días de la semana, y obtener los siguientes resultados:¿Realmente SplFixedArray funciona mejor que las matrices?

<?php 

$days = new SplFixedArray(7); 

$days[0] = "Monday"; 
$days[1] = "Tuesday"; 
$days[2] = "Wednesday"; 
$days[3] = "Thursday"; 
$days[4] = "Friday"; 
$days[5] = "Saturday"; 
$days[6] = "Sunday"; 

echo memory_get_peak_usage() . "\n"; //Returns 327688 
echo memory_get_usage() . "\n"; //Returns 327140 
echo memory_get_peak_usage(true) . "\n"; //Returns 524288 
echo memory_get_usage(true) . "\n"; //Returns 524288 

con matrices tradicionales:

<?php 

$days = array(); 

$days[0] = "Monday"; 
$days[1] = "Tuesday"; 
$days[2] = "Wednesday"; 
$days[3] = "Thursday"; 
$days[4] = "Friday"; 
$days[5] = "Saturday"; 
$days[6] = "Sunday"; 

echo memory_get_peak_usage() . "\n"; //Returns 327528 
echo memory_get_usage() . "\n"; //Returns 326820 
echo memory_get_peak_usage(true) . "\n"; //Returns 524288 
echo memory_get_usage(true) . "\n"; //Returns 524288 

¿Tiene sentido para usted?

+0

su creación de objeto y matriz ... ¿qué quiere ??? – voodoo417

+3

La matriz es probablemente demasiado pequeña para apreciar la diferencia. Prueba benchmarking matrices más grandes, de eso es de lo que SplFixedArray es para todos modos. – Mahn

Respuesta

16

Como se ilustra en los puntos de referencia realizados por el autor de this article:

http://www.johnciacia.com/wp-content/uploads/2011/01/3.png

Se puede concluir que el consumo de memoria de SplFixedArray es de hecho más pequeño, pero perceptible sólo para una gran cantidad de elementos de matriz. Debido a que SplFixedArray es técnicamente an instance of a class también, a diferencia de las matrices tradicionales, eso es lo que está causando que las matrices pequeñas sean realmente más consumidoras de memoria si se implementan por SplFixedArray, pero como estos cientos de bytes extra permanecen constantes, se vuelve irrelevante ya que el tamaño de la matriz crece

Nota al margen: no micro-optimizar, no todos los martillos se crean para cada uña. SplFixedArray está ahí para casos extremos, p. para arreglos de cientos de miles de elementos, donde reducir algunos bytes de uso de memoria por elemento tiene un gran impacto en el uso general de la memoria; pero no se moleste en usarlo a menos que esté realmente seguro de que su matriz es o podría ser un cuello de botella potencial de la aplicación.

9

Se supone que SplFixedArray es más rápido que las matrices. No dice nada sobre el consumo de memoria (que es lo que está probando aquí). De http://www.php.net/splfixedarray:.

"Las principales diferencias entre un SplFixedArray y una matriz PHP normales es que el SplFixedArray es de longitud fija y permite que sólo números enteros dentro del rango como índices La ventaja es que permite una más rápida aplicación array"

Sin embargo, utilizando una matriz de 100000 entradas, revela que también utiliza menos RAM:

$users = array(); 
for ($i=0;$i<100000;$i++) { 
    $users[$i] = array('id' => rand(), 'name' => 'default'); 
} 
echo memory_get_peak_usage(true); //returns 31457280 

$users = new SplFixedArray(100000); 
for ($i=0;$i<100000;$i++) { 
    $users[$i] = array('id' => rand(), 
      'name' => 'default'); 
} 
echo memory_get_peak_usage(true); //return 26738688 
+2

Pero, en general, los SplFixedArrays sí tienen una huella de memoria más pequeña. – Mahn

+0

Tienes razón, lo probé y actualicé mi respuesta con los resultados, es bueno saberlo. – periklis

Cuestiones relacionadas