Протягом деякого часу користуючись PHP, я помітив, що не всі вбудовані функції PHP такі швидкі, як очікувалося. Розглянемо ці дві можливі реалізації функції, яка визначає, чи є число простим, використовуючи кешований масив простих чисел.
//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 );
}
Це тому in_array
, що реалізується за допомогою лінійного пошуку O (n), який лінійно сповільнюватиметься у міру $prime_array
зростання. Якщо array_key_exists
функція реалізована з пошуковим пошуком O (1), який не сповільниться, якщо хеш-таблиця не буде надзвичайно заповнена (у такому випадку це лише O (n)).
Поки що мені доводилося виявляти великі-O через проби та помилки, а також час від часу переглядаючи вихідний код . Тепер для питання ...
Чи є перелік теоретичних (або практичних) великих O-часів для всіх * вбудованих функцій PHP?
* або принаймні цікавого
Наприклад, я вважаю , це дуже важко передбачити , великий O функцій , перерахованих , так як можлива реалізація залежить від невідомих основних структур даних PHP: array_merge
, array_merge_recursive
, array_reverse
, array_intersect
, array_combine
, str_replace
(з входами масиву), і т.д.
true
а потім перевірка на наявність присутності isset($large_prime_array[$number])
. Якщо я правильно пам’ятаю, це в порядку бути в сотні разів швидше in_array
функції.
array_key_exists
, я порівнюю in_array
. in_array
ітератує кожен елемент у масиві і порівнює значення з голкою, яку ви переходите до нього. Якщо ви перевернете значення до ключа (і просто заміните кожне зі значень фіктивного значення, як true
, наприклад , використання isset
в багато разів швидше. Це тому, що ключі масиву індексуються PHP (як хеш-таблиця). Отже, пошук таким чином масив може мати значне поліпшення швидкості