PHP
Benchmarking
microtime() ile kod parçalarını kıyaslayan benchmark yazmayı öğrenirsin.
microtime(true) ile benchmark
microtime(true) o anki zamanı saniye cinsinden ondalıklı sayı olarak döner. Bir kod parçasının süresini ölçmek için öncesi ve sonrasında çağırıp farkını alırsınız: $start = microtime(true); … $end = microtime(true); $elapsed = $end - $start;.
Mikrosaniye hassasiyetinde olduğu için kısa kodları bile karşılaştırabilir. Sonuç makineye ve yüke bağlıdır, bu yüzden tek çalıştırma yerine birden fazla deneyi ortalamak güvenlidir. Ölçüm sonucunu olduğu gibi yazdırmak yerine, iki yaklaşımı aynı koşullarda deneyip sayım farkını karşılaştırmak deterministik yanıt verir.
echo, foreach ve str_replace seçimleri
Aynı işi yapan farklı yöntemlerin maliyeti de farklıdır. echo tek dize yazdırmak için printf'ten hızlıdır çünkü biçimlendirme adımı yoktur; ama değişkenleri birleştirip yazdırmada printf daha okunabilir.
foreach, for ile index kullanmaktan genelde daha hızlıdır çünkü dizi işaretçisini PHP içeriden taşır. array_map her öğe için fonksiyon çağırdığından döngüden yavaştır ama daha bildirgeseldir.
str_replace ve strtr aynı işi yapar: strtr tek geçişte tüm değişimleri uygular, str_replace ardışık uygulayabilir; kısa dizilerde strtr genelde daha hızlıdır. Bu farklar büyük verilerde belirginleşir.
Uygulama isset, array_search, str_replace ve strtr karşılaştır
$start = microtime(true) ile başlat. $data dizisinde 'kiraz' anahtarını isset ile ara, $found_isset'e ata. 3 değerini array_search ile strict modda ara, $key'e ata. 'abab' içinde a→X, b→Y dönüşümünü str_replace ile yap, $out1'e ata. Aynı dönüşümü strtr ile yap, $out2'ye ata. $end = microtime(true) ve $elapsed = $end - $start hesapla. printf ile $found_isset ? 1 : 0 yazdır. echo ile $key, $out1, $out2, count($data) yazdır.
Örnek çözümü göster
0); echo $key . "\n"; echo $out1 . "\n"; echo $out2 . "\n"; echo count($data) . "\n";.
Örnek çözüm:
<?php
$start = microtime(true);
$data = ['elma' => 1, 'armut' => 2, 'kiraz' => 3];
$found_isset = isset($data['kiraz']);
$key = array_search(3, $data, true);
$out1 = str_replace(['a', 'b'], ['X', 'Y'], 'abab');
$out2 = strtr('abab', ['a' => 'X', 'b' => 'Y']);
$end = microtime(true);
$elapsed = $end - $start;
printf("%d\n", $found_isset ? 1 : 0);
echo $key . "\n";
echo $out1 . "\n";
echo $out2 . "\n";
echo count($data) . "\n";
Kendini test et
-
isset ve array_search'ü karşılaştır
- array_search isset'ten daha hızlıdır
- İkisi de aynı hızdadır
- isset yalnızca sayısal dizilerde çalışır
- isset O(1), array_search O(n) olduğundan isset hızlıdır
Cevabı göster
isset O(1), array_search O(n) olduğundan isset hızlıdır — Doğru. isset anahtar tablo araması yapar (O(1)), array_search linear tarar (O(n)).
-
$start atamasını tamamla
____ = microtime(true);
// kod buraya
$end = microtime(true);
Cevabı göster
$start = microtime(true);
// kod buraya
$end = microtime(true);
-
Benchmark yöntemlerini eşleştir
- microtime(true)
- Zaman ölçer
- isset
- O(1) dizi arama
- array_search
- O(n) dizi arama
- strtr
- Tek geçişte değiştir
Sıradaki ders: N+1 sorgu problemi