PHP'yi bir süre kullandıktan sonra, tüm yerleşik PHP işlevlerinin beklendiği kadar hızlı olmadığını fark ettim. Bir sayının önbelleğe alınmış bir primer dizisi kullanılarak birincil olup olmadığını bulan bir işlevin bu iki olası uygulamasını düşünün.
//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 );
}
Bunun nedeni in_array
, $prime_array
büyüdükçe doğrusal olarak yavaşlayacak doğrusal bir arama O (n) ile uygulanmasıdır . Nerede array_key_exists
fonksiyon karma tablo son derece nüfuslu verilmezse yavaşlatmak olmayacak bir karma arama O (1) ile uygulanır (bu durumda o birkaç O (n)).
Şimdiye kadar büyük O'ları deneme yanılma yoluyla keşfetmek zorunda kaldım ve zaman zaman kaynak koduna baktım . Şimdi soru için ...
Tüm yerleşik PHP işlevleri için teorik (veya pratik) büyük O zamanlarının bir listesi var mı?
* veya en azından ilginç olanlar
: Olası uygulama PHP bilinmeyen çekirdek veri yapıları bağlıdır çünkü Örneğin, ben sıralanan işlevlerin büyük O'yu tahmin etmek çok zor bir durum array_merge
, array_merge_recursive
, array_reverse
, array_intersect
, array_combine
, str_replace
(dizi girişli) vb
true
ve daha sonra varlığını kullanarak test etmek olacaktır isset($large_prime_array[$number])
. Doğru hatırlarsam, in_array
işlevden yüz kat daha hızlı olma sırasıdır .
array_key_exists
, karşılaştırıyorum in_array
. in_array
dizideki her öğeyi yineler ve değeri ona ilettiğiniz iğneyle karşılaştırır. Değerleri anahtara çevirirseniz (ve sadece değerlerin her birini kukla bir değerle değiştirirseniz true
, kullanma işlemi isset
birçok kez daha hızlıdır. bu şekilde bir dizi hızda önemli bir iyileşme