Depois de usar o PHP há algum tempo, notei que nem todas as funções embutidas do PHP são tão rápidas quanto o esperado. Considere estas duas implementações possíveis de uma função que descobre se um número é primo usando uma matriz de números primos em 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 );
}
Isso ocorre porque in_array
é implementado com uma pesquisa linear O (n) que diminui linearmente à medida que $prime_array
cresce. Onde a array_key_exists
função é implementada com uma pesquisa de hash O (1), que não diminui a velocidade, a menos que a tabela de hash seja extremamente preenchida (nesse caso, é apenas O (n)).
Até agora, tive que descobrir os grandes Os por tentativa e erro, e ocasionalmente olhando o código-fonte . Agora, a pergunta ...
Existe uma lista dos grandes tempos teóricos (ou práticos) para todas as * funções embutidas do PHP?
* ou pelo menos os interessantes
Por exemplo, acho que é muito difícil prever o grande O de funções listadas porque a possível implementação depende de estruturas de dados do núcleo desconhecido do PHP: array_merge
, array_merge_recursive
, array_reverse
, array_intersect
, array_combine
,str_replace
(com entradas de matriz), etc.
true
e, em seguida, testar a presença isset($large_prime_array[$number])
. Se bem me lembro, é da ordem de centenas de vezes mais rápido que a in_array
função.
array_key_exists
, estou comparando a in_array
.in_array
itera cada item da matriz e compara o valor à agulha que você passa para ela. Se você alternar os valores para a chave (e apenas substituir cada um deles por um valor fictício como true
, usar isset
é muitas vezes mais rápido. Isso ocorre porque as chaves de uma matriz são indexadas pelo PHP (como uma hashtable)). uma matriz dessa maneira pode ter uma melhoria significativa na velocidade. #