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_arraybüyüdükçe doğrusal olarak yavaşlayacak doğrusal bir arama O (n) ile uygulanmasıdır . Nerede array_key_existsfonksiyon 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
trueve daha sonra varlığını kullanarak test etmek olacaktır isset($large_prime_array[$number]). Doğru hatırlarsam, in_arrayişlevden yüz kat daha hızlı olma sırasıdır .
array_key_exists, karşılaştırıyorum in_array. in_arraydizideki 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 issetbirçok kez daha hızlıdır. bu şekilde bir dizi hızda önemli bir iyileşme
