2011-10-01 24 views
5

Conozco varias formas de sacar un carácter de una cadena dado el índice.La forma más rápida de obtener un carácter dentro de una cadena dado el índice (PHP)

<?php 
$string = 'abcd'; 
echo $string[2]; 
echo $string{2}; 
echo substr($string, 2, 1); 
?> 

No sé si hay más formas, si conoce alguna, no dude en agregarla. La pregunta es, si tuviera que elegir y repetir un método arriba un par de millones de veces, posiblemente usando mt_rand para obtener el valor del índice, ¿qué método sería el más eficiente en términos de menor consumo de memoria y la velocidad más rápida?

+1

'$ string [2]' o '$ string {2}' deben ser idénticos en velocidad y consumo de memoria y e cualquiera de ellos debería ser más rápido que substr. – anubhava

Respuesta

18

Para obtener una respuesta, deberá configurar una plataforma de prueba de referencia. Compare todos los métodos en varias iteraciones (cientos de miles o millones) en un cuadro inactivo. Pruebe la función incorporada de microtime para medir la diferencia entre el inicio y el final. Ese es tu tiempo transcurrido.

La prueba debe tomarle 2 minutos para escribir.

Para ahorrarte un poco de esfuerzo, escribí una prueba. Mi propia prueba muestra que la solución funcional (substr) es MUCHO más lenta (esperada). La solución idiomática de PHP ({}) es tan rápida como el método de índice. Ellos son intercambiables. El ([]) es el preferido, ya que esta es la dirección hacia donde se dirige PHP con respecto a las compensaciones de cadena.

<?php 
$string = 'abcd'; 
$limit = 1000000; 

$r = array(); // results 

// PHP idiomatic string index method 
$s = microtime(true); 
for ($i = 0; $i < $limit; ++$i) { 
    $c = $string{2}; 
} 
$r[] = microtime(true) - $s; 
echo "\n"; 

// PHP functional solution 
$s = microtime(true); 
for ($i = 0; $i < $limit; ++$i) { 
    $c = substr($string, 2, 1); 
} 
$r[] = microtime(true) - $s; 
echo "\n"; 

// index method 
$s = microtime(true); 
for ($i = 0; $i < $limit; ++$i) { 
    $c = $string[2]; 
} 
$r[] = microtime(true) - $s; 
echo "\n"; 


// RESULTS 
foreach ($r as $i => $v) { 
    echo "RESULT ($i): $v \n"; 
} 
?> 

Resultados:
resultado (PHP4 & 5 llaves idiomáticas sintaxis): 0.19106006622314
resultado (función Slice cadena): 0.50699090957642
resultado (* sintaxis de índice, el futuro como el llaves están en desuso *): 0.19102001190186

Cuestiones relacionadas