Nachdem ich PHP für eine Weile verwendet habe, habe ich festgestellt, dass nicht alle integrierten PHP-Funktionen so schnell sind wie erwartet. Betrachten Sie diese beiden möglichen Implementierungen einer Funktion, die mithilfe eines zwischengespeicherten Arrays von Primzahlen ermittelt, ob eine Zahl eine Primzahl ist.
//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 );
}
Dies liegt daran in_array
, dass eine lineare Suche O (n) implementiert wird, die sich mit zunehmendem Wachstum linear verlangsamt $prime_array
. Wenn die array_key_exists
Funktion mit einer Hash-Suche O (1) implementiert wird, die nicht verlangsamt wird, es sei denn, die Hash-Tabelle wird extrem gefüllt (in diesem Fall ist es nur O (n)).
Bisher musste ich die Big-O's durch Ausprobieren entdecken und gelegentlich den Quellcode betrachten . Nun zur Frage ...
Gibt es eine Liste der theoretischen (oder praktischen) großen O-Zeiten für alle * integrierten PHP-Funktionen?
* oder zumindest die interessanten
Zum Beispiel habe ich es sehr schwer , die große O Funktionen aufgelistet vorherzusagen , weil die mögliche Implementierung auf unbekannte Kerndatenstrukturen von PHP ab: array_merge
, array_merge_recursive
, array_reverse
, array_intersect
, array_combine
, str_replace
(mit Array - Eingänge), usw.
true
und dann die Anwesenheit mit zu testen isset($large_prime_array[$number])
. Wenn ich mich richtig erinnere, ist es in der Größenordnung hunderte Male schneller als die in_array
Funktion.
array_key_exists
, ich vergleiche mit in_array
. in_array
iteriert jedes Element im Array und vergleicht den Wert mit der Nadel, die Sie an das Array übergeben. Wenn Sie die Werte auf den Schlüssel drehen (und einfach jeden der Werte durch einen Dummy-Wert wie ersetzen true
, ist die Verwendung isset
um ein Vielfaches schneller. Dies liegt daran, dass die Schlüssel eines Arrays von PHP indiziert werden (wie eine Hashtabelle). Folglich wird gesucht Ein Array auf diese Weise kann eine signifikante Verbesserung der Geschwindigkeit haben.