Though, object creation overhead means this method is slower for small arrays.
for example, if the other posters benchmark script is changed to a more realistic:
<?php
$elements = 20;
for($size = 1000; $size < 50000000; $size *= 2) {
echo PHP_EOL . "Testing size: $size" . PHP_EOL;
for($s = microtime(true), $i = 0; $i < $size; $i++) {
for($j=0,$container=array();$j < $elements; $j++ ) {
$container[$i] = NULL;
}
}
echo "Array(): " . (microtime(true) - $s) . PHP_EOL;
for($s = microtime(true), $i = 0; $i < $size; $i++) {
for( $j=0,$container=new SplFixedArray($elements);$j<$elements;$j++) {
$container[$i] = NULL;
}
}
echo "SplArray(): " . (microtime(true) - $s) . PHP_EOL;
}
we get:
Testing size: 1000
Array(): 0.0030221939086914
SplArray(): 0.0041899681091309
Testing size: 2000
Array(): 0.0060598850250244
SplArray(): 0.0083701610565186
Testing size: 4000
Array(): 0.012003898620605
SplArray(): 0.016681909561157
Testing size: 8000
Array(): 0.024173021316528
SplArray(): 0.033347129821777
Testing size: 16000
Array(): 0.048118829727173
SplArray(): 0.066897869110107
Testing size: 32000
Array(): 0.096546173095703
SplArray(): 0.13370203971863
Testing size: 64000
Array(): 0.1932430267334
SplArray(): 0.26755595207214
Testing size: 128000
Array(): 0.38473010063171
SplArray(): 0.5374698638916
Testing size: 256000
Array(): 0.77228307723999
SplArray(): 1.0708079338074
Testing size: 512000
Array(): 1.5438990592957
SplArray(): 2.1406710147858
Testing size: 1024000
Array(): 3.0910761356354
SplArray(): 4.3108429908752
Testing size: 2048000
Array(): 6.1561989784241
SplArray(): 8.612802028656
......
La classe SplFixedArray
Introduction
La classe SplFixedArray fournit les fonctionnalités principales d'un tableau. La différence majeure entre un objet SplFixedArray et un tableau standard de PHP est que SplFixedArray est de taille fixe, et n'utilise que des entier dans ses index. L'avantage est alors qu'il est plus rapide que les tableaux.
Synopsis de la classe
SplFixedArray
/* Méthodes */
}Exemples
Exemple #1 Exemple avec SplFixedArray
<?php
// Initialisation d'un tableau avec une taille fixe
$array = new SplFixedArray(5);
$array[1] = 2;
$array[4] = "foo";
var_dump($array[0]); // NULL
var_dump($array[1]); // int(2)
var_dump($array["4"]); // string(3) "foo"
// Augmentation de la taille à 10
$array->setSize(10);
$array[9] = "asdf";
// Réduction de taille de 2
$array->setSize(2);
// Les lignes suivantes émettent une RuntimeException : index invalide ou hors de l'intervalle
try {
var_dump($array["non-numeric"]);
} catch(RuntimeException $re) {
echo "RuntimeException : ".$re->getMessage()."\n";
}
try {
var_dump($array[-1]);
} catch(RuntimeException $re) {
echo "RuntimeException : ".$re->getMessage()."\n";
}
try {
var_dump($array[5]);
} catch(RuntimeException $re) {
echo "RuntimeException : ".$re->getMessage()."\n";
}
?>
L'exemple ci-dessus va afficher :
NULL int(2) string(3) "foo" RuntimeException: Index invalid or out of range RuntimeException: Index invalid or out of range RuntimeException: Index invalid or out of range
Sommaire
- SplFixedArray::__construct — Construit un nouveau SplFixedArray
- SplFixedArray::count — Retourne la taille du tableau à taille fixe
- SplFixedArray::current — Lit l'élément courant du tableau à taille fixe
- SplFixedArray::fromArray — Importe un tableau PHP dans un tableau à taille fixe
- SplFixedArray::getSize — Lit la taille du tableau à taille fixe
- SplFixedArray::key — Retourne l'index de la position courante
- SplFixedArray::next — Déplace l'itérateur à l'élément suivant
- SplFixedArray::offsetExists — Vérifie si l'index demandé existe
- SplFixedArray::offsetGet — Retourne la valeur à l'index donné
- SplFixedArray::offsetSet — Affecte une valeur à un index donné
- SplFixedArray::offsetUnset — Détruit l'élément à un index donné
- SplFixedArray::rewind — Remet l'itérateur au début du tableau à taille fixe
- SplFixedArray::setSize — Change la taille d'un tableau à taille fixe
- SplFixedArray::toArray — Retourne un tableau PHP à partir d'un tableau à taille fixe
- SplFixedArray::valid — Vérifie si le tableau contient encore un élément
SplFixedArray
nairbv AT yahoo DOT com
21-Oct-2009 11:08
21-Oct-2009 11:08
chrisstocktonaz at gmail dot com
14-Jul-2009 08:07
14-Jul-2009 08:07
Note, that this is considerably faster and should be used when the size of the array is known. Here are some very basic bench marks:
<?php
for($size = 1000; $size < 50000000; $size *= 2) {
echo PHP_EOL . "Testing size: $size" . PHP_EOL;
for($s = microtime(true), $container = Array(), $i = 0; $i < $size; $i++) $container[$i] = NULL;
echo "Array(): " . (microtime(true) - $s) . PHP_EOL;
for($s = microtime(true), $container = new SplFixedArray($size), $i = 0; $i < $size; $i++) $container[$i] = NULL;
echo "SplArray(): " . (microtime(true) - $s) . PHP_EOL;
}
?>
OUTPUT
Testing size: 1000
Array(): 0.00046396255493164
SplArray(): 0.00023293495178223
Testing size: 2000
Array(): 0.00057101249694824
SplArray(): 0.0003058910369873
Testing size: 4000
Array(): 0.0015869140625
SplArray(): 0.00086307525634766
Testing size: 8000
Array(): 0.0024251937866211
SplArray(): 0.00211501121521
Testing size: 16000
Array(): 0.0057680606842041
SplArray(): 0.0041120052337646
Testing size: 32000
Array(): 0.011334896087646
SplArray(): 0.007631778717041
Testing size: 64000
Array(): 0.021990060806274
SplArray(): 0.013560056686401
Testing size: 128000
Array(): 0.053267002105713
SplArray(): 0.030976057052612
Testing size: 256000
Array(): 0.10280108451843
SplArray(): 0.056283950805664
Testing size: 512000
Array(): 0.20657992362976
SplArray(): 0.11510300636292
Testing size: 1024000
Array(): 0.4138810634613
SplArray(): 0.21826505661011
Testing size: 2048000
Array(): 0.85640096664429
SplArray(): 0.46247816085815
Testing size: 4096000
Array(): 1.7242450714111
SplArray(): 0.95304894447327
Testing size: 8192000
Array(): 3.448086977005
SplArray(): 1.96746301651
