Dopo aver usato PHP per un po 'di tempo, ho notato che non tutte le funzioni PHP integrate sono veloci come previsto. Considera queste due possibili implementazioni di una funzione che rileva se un numero è primo usando una matrice di numeri primi memorizzata nella cache.
//very slow for large $prime_array
$prime_array = array( 2, 3, 5, 7, 11, 13, .... 104729, ... );
$result_array = array();
foreach( $prime_array => $number ) {
$result_array[$number] = in_array( $number, $large_prime_array );
}
//speed is much less dependent on size of $prime_array, and runs much faster.
$prime_array => array( 2 => NULL, 3 => NULL, 5 => NULL, 7 => NULL,
11 => NULL, 13 => NULL, .... 104729 => NULL, ... );
foreach( $prime_array => $number ) {
$result_array[$number] = array_key_exists( $number, $large_prime_array );
}
Questo perché in_array
è implementato con una ricerca lineare O (n) che rallenterà linearmente man mano che $prime_array
cresce. Dove ilarray_key_exists
funzione è implementata con una ricerca hash O (1) che non rallenterà a meno che la tabella hash non sia estremamente popolata (nel qual caso è solo O (n)).
Finora ho dovuto scoprire i big-O tramite tentativi ed errori, e occasionalmente guardando il codice sorgente . Ora per la domanda ...
Esiste un elenco dei grandi O teorici (o pratici) per tutte le * funzioni PHP integrate?
* o almeno quelli interessanti
Ad esempio, trovo molto difficile prevedere il grande O di funzioni elencate perché la possibile implementazione dipende strutture di dati Sconosciuto fondamentali di PHP: array_merge
, array_merge_recursive
, array_reverse
, array_intersect
, array_combine
, str_replace
(con ingressi matrice), etc.
true
e quindi verificare la presenza utilizzando isset($large_prime_array[$number])
. Se ricordo bene, è nell'ordine di essere centinaia di volte più veloce della in_array
funzione.
array_key_exists
, sto confrontando in_array
. in_array
scorre ogni elemento nell'array e confronta il valore con l'ago che gli viene passato. Se capovolgi i valori sulla chiave (e sostituisci ciascuno di essi con un valore fittizio come true
, l'utilizzo isset
è molte volte più veloce. Questo perché le chiavi di un array sono indicizzate da PHP (come una tabella hash). Di conseguenza, la ricerca un array in questo modo può avere un significativo miglioramento della velocità