que prueban su código en PHP 5.3.9. Para hacerlo tuve que traducir []
a array()
, y también tuve que corregir tu línea # 12: de $a=new MyTest($size)
, a $mytest=new MyTest($size)
(por cierto, el argumento constructor se ignora silenciosamente, es divertido). También he añadido este código:
echo "================".PHP_EOL;
echo "Testing Function".PHP_EOL;
for($size = 1000; $size < 1000000; $size *= 2) {
$start = milliseconds();
for ($a=array(), $i=0;$i<$size;$i++) {
my_push($a);
}
$end = milliseconds();
echo "Array Size $size".PHP_EOL;
echo $end - $start . " milliseconds to perform".PHP_EOL;
echo "memory usage: ".memory_get_usage()." , real: ".memory_get_usage(true).PHP_EOL;
}
function my_push(&$a)
{
$a[] = array(new stdClass());
}
he añadido la línea de uso de la memoria a sus bucles en el mismo punto, añadí un unset($mytest);
después del caso objeto (para obtener un registro de memoria más consistente), y también se sustituye el 5000000 de la 1000000 porque solo tengo 2GB de RAM. Esto es lo que tengo:
Testing Objects
Array Size 1000
2 milliseconds to perform
memory usage: 1666376 , real: 1835008
Array Size 2000
5 milliseconds to perform
memory usage: 2063280 , real: 2097152
Array Size 4000
10 milliseconds to perform
memory usage: 2857008 , real: 2883584
Array Size 8000
19 milliseconds to perform
memory usage: 4444456 , real: 4718592
Array Size 16000
44 milliseconds to perform
memory usage: 7619392 , real: 8126464
Array Size 32000
103 milliseconds to perform
memory usage: 13969256 , real: 14417920
Array Size 64000
239 milliseconds to perform
memory usage: 26668936 , real: 27262976
Array Size 128000
588 milliseconds to perform
memory usage: 52068368 , real: 52690944
Array Size 256000
1714 milliseconds to perform
memory usage: 102867104 , real: 103546880
Array Size 512000
5452 milliseconds to perform
memory usage: 204464624 , real: 205258752
================
Testing Array
Array Size 1000
1 milliseconds to perform
memory usage: 18410640 , real: 20709376
Array Size 2000
4 milliseconds to perform
memory usage: 18774760 , real: 20709376
Array Size 4000
7 milliseconds to perform
memory usage: 19502976 , real: 20709376
Array Size 8000
13 milliseconds to perform
memory usage: 20959360 , real: 21233664
Array Size 16000
29 milliseconds to perform
memory usage: 23872176 , real: 24379392
Array Size 32000
61 milliseconds to perform
memory usage: 29697720 , real: 30146560
Array Size 64000
124 milliseconds to perform
memory usage: 41348856 , real: 41943040
Array Size 128000
280 milliseconds to perform
memory usage: 64651088 , real: 65273856
Array Size 256000
534 milliseconds to perform
memory usage: 111255536 , real: 111935488
Array Size 512000
1085 milliseconds to perform
memory usage: 204464464 , real: 205258752
================
Testing Function
Array Size 1000
357 milliseconds to perform
memory usage: 18410696 , real: 22544384
Array Size 2000
4 milliseconds to perform
memory usage: 18774768 , real: 22544384
Array Size 4000
9 milliseconds to perform
memory usage: 19503008 , real: 22544384
Array Size 8000
17 milliseconds to perform
memory usage: 20959392 , real: 22544384
Array Size 16000
36 milliseconds to perform
memory usage: 23872208 , real: 24379392
Array Size 32000
89 milliseconds to perform
memory usage: 29697720 , real: 30146560
Array Size 64000
224 milliseconds to perform
memory usage: 41348888 , real: 41943040
Array Size 128000
529 milliseconds to perform
memory usage: 64651088 , real: 65273856
Array Size 256000
1587 milliseconds to perform
memory usage: 111255616 , real: 111935488
Array Size 512000
5244 milliseconds to perform
memory usage: 204464512 , real: 205258752
Como se puede ver, añadiendo a la matriz dentro de una llamada a la función cuesta casi tanto como (y tiene el mismo comportamiento no lineal como) lo hace dentro de su llamada método original. Una cosa se puede decir con certeza:
¡Son las llamadas a las funciones las que consumen el tiempo de la CPU!
En cuanto al comportamiento no lineal, se vuelve realmente evidente solo por encima de un cierto umbral. Mientras que los tres casos tienen el mismo comportamiento de memoria (debido a la recolección incompleta de gargabe esto solo es evidente entre los casos de "matriz simple" y "matriz dentro de función", en este registro), es el "método dentro de matriz" y el " array inside function "casos que tienen el mismo comportamiento de tiempo de ejecución. Esto significa que son las llamadas de función las que provocan un aumento de tiempo no lineal. Me parece que esto se puede decir:
La cantidad de datos que hay alrededor durante una llamada de función influye en su duración.
Para comprobar esto que sustituyen todas $a[]
con $a[0]
y todos con 1,000,000 5,000,000 (para obtener tiempos de ejecución totales similares) y se obtuvo este resultado:
Testing Objects
Array Size 1000
2 milliseconds to perform
memory usage: 1302672 , real: 1572864
Array Size 2000
4 milliseconds to perform
memory usage: 1302672 , real: 1572864
Array Size 4000
8 milliseconds to perform
memory usage: 1302672 , real: 1572864
Array Size 8000
15 milliseconds to perform
memory usage: 1302672 , real: 1572864
Array Size 16000
31 milliseconds to perform
memory usage: 1302672 , real: 1572864
Array Size 32000
62 milliseconds to perform
memory usage: 1302672 , real: 1572864
Array Size 64000
123 milliseconds to perform
memory usage: 1302672 , real: 1572864
Array Size 128000
246 milliseconds to perform
memory usage: 1302672 , real: 1572864
Array Size 256000
493 milliseconds to perform
memory usage: 1302672 , real: 1572864
Array Size 512000
985 milliseconds to perform
memory usage: 1302672 , real: 1572864
Array Size 1024000
1978 milliseconds to perform
memory usage: 1302672 , real: 1572864
Array Size 2048000
3965 milliseconds to perform
memory usage: 1302672 , real: 1572864
Array Size 4096000
7905 milliseconds to perform
memory usage: 1302672 , real: 1572864
================
Testing Array
Array Size 1000
1 milliseconds to perform
memory usage: 1302464 , real: 1572864
Array Size 2000
3 milliseconds to perform
memory usage: 1302464 , real: 1572864
Array Size 4000
5 milliseconds to perform
memory usage: 1302464 , real: 1572864
Array Size 8000
10 milliseconds to perform
memory usage: 1302464 , real: 1572864
Array Size 16000
20 milliseconds to perform
memory usage: 1302464 , real: 1572864
Array Size 32000
40 milliseconds to perform
memory usage: 1302464 , real: 1572864
Array Size 64000
80 milliseconds to perform
memory usage: 1302464 , real: 1572864
Array Size 128000
161 milliseconds to perform
memory usage: 1302464 , real: 1572864
Array Size 256000
322 milliseconds to perform
memory usage: 1302464 , real: 1572864
Array Size 512000
646 milliseconds to perform
memory usage: 1302464 , real: 1572864
Array Size 1024000
1285 milliseconds to perform
memory usage: 1302464 , real: 1572864
Array Size 2048000
2574 milliseconds to perform
memory usage: 1302464 , real: 1572864
Array Size 4096000
5142 milliseconds to perform
memory usage: 1302464 , real: 1572864
================
Testing Function
Array Size 1000
1 milliseconds to perform
memory usage: 1302464 , real: 1572864
Array Size 2000
4 milliseconds to perform
memory usage: 1302464 , real: 1572864
Array Size 4000
6 milliseconds to perform
memory usage: 1302464 , real: 1572864
Array Size 8000
14 milliseconds to perform
memory usage: 1302464 , real: 1572864
Array Size 16000
26 milliseconds to perform
memory usage: 1302464 , real: 1572864
Array Size 32000
53 milliseconds to perform
memory usage: 1302464 , real: 1572864
Array Size 64000
105 milliseconds to perform
memory usage: 1302464 , real: 1572864
Array Size 128000
212 milliseconds to perform
memory usage: 1302464 , real: 1572864
Array Size 256000
422 milliseconds to perform
memory usage: 1302464 , real: 1572864
Array Size 512000
844 milliseconds to perform
memory usage: 1302464 , real: 1572864
Array Size 1024000
1688 milliseconds to perform
memory usage: 1302464 , real: 1572864
Array Size 2048000
3377 milliseconds to perform
memory usage: 1302464 , real: 1572864
Array Size 4096000
6814 milliseconds to perform
memory usage: 1302464 , real: 1572864
Nota cómo los tiempos son casi perfectamente lineal ahora. Por supuesto, el tamaño de la matriz está pegado a 1 ahora. Tenga en cuenta también cómo las diferencias de los tiempos de ejecución de los tres casos son menos pronunciadas que antes. Recuerde que la operación más interna es la misma en todos los casos.
No voy a tratar de explicar completamente todo esto (¿colección gargabe en función de llamada? ¿Fragmentación de memoria? ...?), Pero creo que he recopilado información útil, para todos aquí y para mí también.
Duda es un problema de matriz, pero podría ser una sobrecarga de OOP, ya que estás construyendo esa matriz dentro de un objeto - muchos sobrecarga de OOP. Si reemplaza temporalmente ese miembro objeto con una variable global estándar, ¿cambia el rendimiento? –
¿Podrías por favor reducir esta pregunta al problema real, dejando todo el asunto de prggmr? Hace la pregunta difícil de entender. – NikiC
@MarcB Hay un cambio, pero no es un cambio significativo (cambiar el historial para almacenar solo verdadero '' $ this -> _ event_history [] = [true] '' 'produce 9532 por segundo en 10 segundos. @NikiC Do usted tiene un consejo sobre cómo podría recortar esto? – Nick