2011-10-01 18 views
5

Conosco diversi modi per ottenere un carattere da una stringa dato l'indice.Il modo più veloce per ottenere un carattere all'interno di una stringa dato l'indice (PHP)

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

Non so se ci sono altri modi, se ne conosci uno per favore non esitare ad aggiungerlo. La domanda è: se dovessi scegliere e ripetere un metodo sopra un paio di milioni di volte, possibilmente usando mt_rand per ottenere il valore dell'indice, quale metodo sarebbe il più efficiente in termini di minor consumo di memoria e velocità più veloce?

+1

'$ stringa [2]' o '$ stringa {2}' deve essere identico in velocità e consumo di memoria ed e entrambi dovrebbero essere più veloci di substr. – anubhava

risposta

18

Per arrivare a una risposta, è necessario impostare un banco di prova di riferimento. Confronta tutti i metodi su più iterazioni (centinaia di migliaia o milioni) su una casella inattiva. Prova la funzione microtime integrata per misurare la differenza tra inizio e fine. Questo è il tuo tempo trascorso.

Il test dovrebbe richiedere tutti i 2 minuti per scrivere.

Per risparmiarti qualche sforzo, ho scritto un test. Il mio test mostra che la soluzione funzionale (substr) è MOLTO più lenta (attesa). La soluzione idiomatic PHP ({}) è veloce quanto il metodo index. Sono intercambiabili. Il ([]) è preferito, in quanto questa è la direzione in cui PHP sta andando per quanto riguarda gli offset delle stringhe.

<?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"; 
} 
?> 

Risultati:
RISULTATO (PHP4 & 5 bretelle idiomatiche sintassi): ,19106006622314
RISULTATO (stringa funzione Slice): ,50699090957642
RISULTATO (* sintassi index, il futuro come il le parentesi sono deprecate *): 0.19102001190186

Problemi correlati