Wyniki dla 80000 obiektow:
Kod
list creation : 104.79511 MB
referencing by reference : 03.55194 MB
referencing by reference : 00.14405 s
list creation : 104.79511 MB
referencing by key name STRING : 05.38295 MB
referencing by key name STRING : 00.28383 s
list creation : 104.79511 MB
referencing by key name INTEGER : 04.77258 MB
referencing by key name INTEGER : 00.19460 s
Czyli
* ilosc zajmowanego miejsca (im mniej tym lepiej):
referencje < integer < string
Poza tym same obiekty zajmuja ok. 25x wiecej niz tablia z referencjami/indeksami do tych obiektow
* Szybkosc dostepu do obiektow (im mniej tym lepiej):
referencje < integer < string
Wniosek: referencje sa najszybsze i zajmuja najmniej miejsca, choc w porownaniu z tablica obiektow kazda metoda zajmuje duzo mniej miejsca.
PS. Nie nalezy uruchamiac trzech testow za jednym razem, php osiagaja granice dostepnej pamieci, usuwa niepotrzebne obiekty/dane przez co po utworzeniu tablicy mozemy otrzymac wieksza ilosc wolnej pamieci niz przed (stare obiekty usuniete w czasie tworzenia nych --> zuzycie pamieci ujemne

)
Test:
<pre>
memory_limit = 128M
php 5.1.5
<?php
define( 'OBJECTS_COUNT', 80000
); //define( 'ARRAY_KEY_PREFIX', 'very_long_array_key_prefix' );
define( 'ARRAY_KEY_PREFIX', '' );
$test_type = @$_GET[ 'test' ];
$test_type = ($test_type) ? $test_type : 'lol';
print( '<a href="?test=reference">reference</a><br />' ); print( '<a href="?test=string">string</a><br />' ); print( '<a href="?test=integer">integer</a><br />' );
class Object
{
private $name = "lol.";
private $count = 100;
private $largeString = '';
public function __construct()
{
$this->largeString = str_repeat( '1234567890', 100
); }
}
function createInitialList( $count )
{
for ( $i = 0; $i < $count; $i++ )
{
$list[ $i ] = new Object();
}
return $list;
}
function printTimeDelta( $end, $start, $msg )
{
printf( "%40s : %08.5f s<br />", $msg, ( $end - $start ) ); }
function printMemoryUsage( $end, $start, $msg )
{
printf( "%40s : %08.5f MB<br />", $msg, ( ( $end - $start ) / 1048576
) ); }
function pickEveryXthItemReferences( $array, $X )
{
$count = count( $array );
for ( $i = 0; $i < $count ; $i += $X )
{
$newArray []= $array[ $i ]; // zapisz referencje do obiektu
}
return $newArray;
}
function pickEveryXthItemKeyNameInteger( $array, $X )
{
$count = count( $array );
for ( $i = 0; $i < $count ; $i += $X )
{
$newArray []= $i; // zapisz indeks tablicy
}
return $newArray;
}
function pickEveryXthItemKeyNameString( $array, $X )
{
$count = count( $array );
for ( $i = 0; $i < $count ; $i += $X )
{
$newArray [ ARRAY_KEY_PREFIX . $i ]= ARRAY_KEY_PREFIX . $i; // zapisz indeks (jako stringa) tablicy
}
return $newArray;
}
$memStart = 1;
$memEnd = 1;
$timeStart = 0.1;
$timeEnd = 0.1;
// utworzaenie listy obiektow, indeksowanych 0,1,...
$objectList = createInitialList( OBJECTS_COUNT );
printMemoryUsage( $memEnd, $memStart, "list creation" );
switch ( $test_type )
{
case 'reference':
{
// tablica zawiera referencje do obiektow
// wybranie polowy obiektow do nowej tablicy
$list_references = pickEveryXthItemReferences( $objectList, Xth);
printMemoryUsage( $memEnd, $memStart, "referencing by reference" );
foreach ( $list_references as $item )
{
$x = $item;
$x = NULL;
}
printTimeDelta( $timeEnd, $timeStart, "referencing by reference" );
break;
}
case 'string':
{
// tablica zawiera indeksy tablicy $objectList
// indeksy sa STRINGAMI
// wybranie polowy obiektow do nowej tablicy
$list_keysString = pickEveryXthItemKeyNameString( $objectList, Xth);
printMemoryUsage( $memEnd, $memStart, "referencing by key name STRING" );
foreach ( $list_keysString as $key )
{
$x = $objectList[ (int)$key ];
$x = NULL;
}
printTimeDelta( $timeEnd, $timeStart, "referencing by key name STRING" );
break;
}
case 'integer':
{
// tablica zawiera indeksy tablicy $objectList
// indeksy sa liczbami!!
// wybranie polowy obiektow do nowej tablicy
$list_keysInteger = pickEveryXthItemKeyNameInteger( $objectList,Xth);
printMemoryUsage( $memEnd, $memStart, "referencing by key name INTEGER" );
foreach ( $list_keysInteger as $key )
{
$x = $objectList[ $key ];
$x = NULL;
}
printTimeDelta( $timeEnd, $timeStart, "referencing by key name INTEGER" );
break;
}
default :
{
}
}
reset( $objectList ); // proba zapobiegniecia wyrzuceniu z pamieci tablicy $objectList /*
nie nalezy uruchamiac 3ech trestow na raz, gdyz php uruchamia garbagecollectora,
gdy konczy mu sie pamiec, co znieksztalca wyniki
*/
?></pre>
---
sorry za taki burdel w kodzie, ale spojrzcie na zegar