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_arraycresce. Onde a array_key_existsfunçã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.
truee, 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_arrayfunção.
array_key_exists, estou comparando a in_array.in_arrayitera 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. #
