Rendimiento de adición de elementos a un array en PHP

Cuando tenemos que añadir elementos a un array en PHP, al igual que en otros lenguajes, hay muchas formas de hacerlo. En mi caso utilizaba el acceso directamente por índice, que para bucles triviales era muy conveniente (opción 2); o bien array_push, muy efectivo si nos queríamos ahorrar el índice, o si era necesario agregar más de un elemento a la vez.

Sin embargo, resulta sorprendente que no conociera la construcción $array[] =, que automáticamente mete elementos al final del arreglo, y que se encuentra incluso documentada como mejor candidato a array_push al agregar solamente un elemento. Esta forma no es solamente más sencilla y breve, sino también algo más eficiente como veremos a continuación.

Tras casi tres años de Rendimiento de variables dentro de cadenas en PHP, nada más sencillo que comprobar los efectos de cada una de las formas. Las pruebas de eficiencia se han ejecutado con PHP 5.4.9 sobre Kubuntu 13.04.

Opción 1: $arData[] = $iCont2
La opción recomendada, y que desconocía, añade en este caso un valor numérico al siguiente índice del array.

Opción 2: $arData[$iCont2] = $iCont2
La versión tradicional de especificar el índice sobre el que queremos añadir el elemento.

Opción 3: $arData[count($arData)] = $iCont2
Especificar el primer índice disponible, para agregarlo al final.

Opción 4: array_push($arData, $iCont2)
Usar la función array_push.

Los resultados obtenidos han sido:

FormaTiempo (s)
$arData[] = $iCont26.4526679515839
$arData[$iCont2] = $iCont26.5631868839264
$arData[count($arData)] = $iCont212.127758979797
array_push($arData, $iCont2)12.594254016876
<?php
  error_reporting(E_ALL);
  set_time_limit(0);
  $fStart = microtime(true);
  for ($iCont1 = 0; $iCont1 < 1000; $iCont1++)
  {
    $arData = Array();
    for ($iCont2 = 0; $iCont2 < 10000; $iCont2++)
    {
      $arData[] = $iCont2;
    }
  }
  $fStop = microtime(true);
  echo '$arData[] = $iCont2: ' . ($fStop - $fStart) . '<br/>';
 
 
  $fStart = microtime(true);
  for ($iCont1 = 0; $iCont1 < 1000; $iCont1++)
  {
    $arData = Array();
    for ($iCont2 = 0; $iCont2 < 10000; $iCont2++)
    {
      $arData[$iCont2] = $iCont2;
    }
  }
  $fStop = microtime(true);
  echo '$arData[$iCont2] = $iCont2: ' . ($fStop - $fStart) . '<br/>';
 
 
  $fStart = microtime(true);
  for ($iCont1 = 0; $iCont1 < 1000; $iCont1++)
  {
    $arData = Array();
    for ($iCont2 = 0; $iCont2 < 10000; $iCont2++)
    {
      $arData[count($arData)] = $iCont2;
    }
  }
  $fStop = microtime(true);
  echo '$arData[count($arData)] = $iCont2: ' . ($fStop - $fStart) . '<br/>';
 
 
  $fStart = microtime(true);
  for ($iCont1 = 0; $iCont1 < 1000; $iCont1++)
  {
    $arData = Array();
    for ($iCont2 = 0; $iCont2 < 10000; $iCont2++)
    {
      array_push($arData, $iCont2);
    }
  }
  $fStop = microtime(true);
  echo 'array_push($arData, $iCont2): ' . ($fStop - $fStart) . '<br/>';
?>

Apreciamos dos tendencias claras. Las dos primeras opciones, son aproximadamente el doble de veloces, no acarrean la sobrecarga ni de contar cuantos elementos tiene el array, ni de ejecutar una función.

Entre las dos primeras, las diferencias de rendimiento son menores de las que podría pensarse a priori, si bien la primera es tremendamente más simple.



4 comentarios en “Rendimiento de adición de elementos a un array en PHP”

  1. Buenas!

    En la propia documentación de PHP podemos leer que array_push no se recomienda para la inserción de un único elemento. Sólo es recomendable utilizar dicha función para insertar el mayor número posible.

    Un saludo

  2. Que no conocieras la construcción $array[] = $value; es casi un delito ;D

    Desde que comprendí el uso de los arrays asociativos de PHP hago un uso casi intensivo de los arrays y gracias a ello ciertas operaciones complejas se vuelven más sencillas. Por ejemplo cuando queremos concatenar varios valores con una clave y luego realizar un sha1 (muy común en ciertas API’s) es muy fácil hacer la concatenación con un implode().

    Saludos

Deja un comentario