Accediendo a Big Arrays en PHP
He estado haciendo algunos perfiles de diferentes métodos para acceder a grandes (ish) arreglos de datos en PHP. El caso de uso es bastante simple: algunas de nuestras herramientas generan datos en archivos PHP como matrices asociativas y la aplicación considera estos archivos como datos estáticos. Hacemos juegos, por lo que algunos ejemplos de archivos de datos incluirían elementos en un catálogo, tareas que un usuario debe completar o definiciones para mapas:
<?php
$some_data = array(
...lots and lots of stuff in here...
);
?>
Dado que estas matrices son grandes (400K), y gran parte de nuestro código está interesado en estos datos, es necesario acceder a estos datos de la manera más eficiente posible. Me decidí a sincronizar 3 patrones diferentes para hacer esto. Después de presentar los métodos compartiré mis resultados a continuación.
Lo que estoy buscando es una validación basada en la experiencia de estos métodos y su sincronización, así como cualquier otro método para probar.
Método # 1: función getterEn el método, el exportador en realidad crea un archivo que se ve así:
<?php
function getSomeData()
{
$some_data = array(
...lots and lots of stuff here...
);
return $some_data;
}
?>
El código del cliente puede obtener los datos simplemente llamando a getSomeData () cuando lo deseen.
Método # 2: global + includeEn este método, el archivo de datos parece idéntico al bloque de código original anterior, sin embargo, el código del cliente debe saltar a través de unos pocos aros para obtener los datos en un ámbito local. Esto supone que la matriz está en un archivo llamado 'some_data.php';
global $some_data; //must be the same name as the variable in the data file...
include 'some_data.php';
Esto traerá la matriz $ some_data al alcance, aunque es un poco incómodo para el código del cliente (mi opinión).
Método # 3: getter por referenciaEste método es casi idéntico al Método # 1, sin embargo, la función getter no devuelve un valor, sino que establece una referencia a los datos.
<?php
function getSomeDataByRef($some_data)
{
$some_data = array(
...lots and lots of stuff here...
);
return $some_data;
}
?>
El código del cliente luego recupera los datos declarando una variable local (llamada cualquier cosa) y pasándola por referencia al captador:
$some_data_anyname = array();
getSomeDataByRef(&$some_data_anyname);
ResultadosAsí que ejecuté un pequeño script que ejecuta cada uno de estos métodos de recuperación de datos 1000 veces y promedia el tiempo de ejecución (calculado por microtime (verdadero) al principio y al final). Los siguientes son mis resultados (en ms, ejecutándose en un MacBookPro de 2 GHz, 8GB de RAM, PHP versión 5.3.4):
MÉTODO 1:AVG: 0.0031637034416199 MAX: 0.0043289661407471 MIN: 0.0025908946990967
MÉTODO # 2:AVG: 0.01434082698822 MAX: 0.018275022506714 MIN: 0.012722969055176
MÉTODO # 3:AVG: 0.00335768699646 MAX: 0.0043489933013916 MIN: 0.0029017925262451
Parece bastante claro, a partir de estos datos, que el método global + include es inferior a los otros dos, que son una diferencia "despreciable".
¿Pensamientos? ¿Estoy perdiendo algo por completo? (probablemente...)
¡Gracias por adelantado!