IF mi yoksa Switch mi daha hızlıdır?

Geçenlerde R10.net forumda MonteCristo sorusu üzerine bir satır kod eklemiştim. Başlık altındaki cevaplar devam ederken if ya da switch fonksiyonlarının hangisinin daha hızlı olduğu sorusu ortaya çıktı. O vakit, birkaç satırdan oluşan ve bu fonksiyonların hangisinin daha hızlı olduğunu gösteren kod yazmıştım. Şimdi bunu sizlerle de paylaşıyorum 😉

MonteCristo’nun sorusu burada ve PHP ile önümüzdeki Cumartesi gününe kaç gün kaldığını gösteren bir kod istiyordu. Bu işlemi if ve switch ile illa ki yapabiliyorsunuz. Fakat amacınız en az kaynak tüketen bir kod yazmak ise, bu tarz kodlamalara dikkat etmek gerekiyor. Bu işlem için ne if ne switch, switch fonksiyonunun kısayolunu önermiştim. Şimdi orada karşılaştırma yaptırdığım kodları görelim.

//Switch ile uygulama
function timer_stop() {
global $timestart, $timeend;
$mtime = microtime();
$mtime = explode(' ',$mtime);
$mtime = $mtime[1] + $mtime[0];
$timeend = $mtime;
$timetotal = $timeend-$timestart;
return number_format($timetotal,5);
}
function timer_start() {
global $timestart;
$mtime = explode(' ', microtime() );
$mtime = $mtime[1] + $mtime[0];
$timestart = $mtime;
return true;
}
timer_start();
$bugun = date("l");
for ($i=0; $i<10000; $i++) { switch ($bugun) { case "Monday": $kacgunkaldi = 5; break; case "Tuesday": $kacgunkaldi = 4; break; case "Wednesday": $kacgunkaldi = 3; break; case "Thursday": $kacgunkaldi = 2; break; case "Friday": $kacgunkaldi = 1; break; case "Saturday": $kacgunkaldi = 0; break; case "Sunday": $kacgunkaldi = 6; break; } } echo "Cumartesi gününe ".$kacgunkaldi." gün kaldı."; echo 'Derlenme Süresi: '. timer_stop(); // Derlenme süresi ortalama 0,01203 sn

//If ile uygulama
function timer_stop() {
global $timestart, $timeend;
$mtime = microtime();
$mtime = explode(' ',$mtime);
$mtime = $mtime[1] + $mtime[0];
$timeend = $mtime;
$timetotal = $timeend-$timestart;
return number_format($timetotal,5);
}
function timer_start() {
global $timestart;
$mtime = explode(' ', microtime() );
$mtime = $mtime[1] + $mtime[0];
$timestart = $mtime;
return true;
}
timer_start();
$bugun = date("l");
for ($i=0; $i<10000; $i++) { if ($bugun=='Monday') $kacgunkaldi = 5; if ($bugun=='Tuesday') $kacgunkaldi = 4; if ($bugun=='Wednesday') $kacgunkaldi = 3; if ($bugun=='Thursday') $kacgunkaldi = 2; if ($bugun=='Friday') $kacgunkaldi = 1; if ($bugun=='Saturday') $kacgunkaldi = 0; if ($bugun=='Sunday') $kacgunkaldi = 6; } echo "Cumartesi gününe ".$kacgunkaldi." gün kaldı."; echo 'Derlenme Süresi: '. timer_stop(); // Derlenme süresi ortalama 0,02144 sn

//Switch kısayolu ile
function timer_stop() {
global $timestart, $timeend;
$mtime = microtime();
$mtime = explode(' ',$mtime);
$mtime = $mtime[1] + $mtime[0];
$timeend = $mtime;
$timetotal = $timeend-$timestart;
return number_format($timetotal,5);
}
function timer_start() {
global $timestart;
$mtime = explode(' ', microtime() );
$mtime = $mtime[1] + $mtime[0];
$timestart = $mtime;
return true;
}
timer_start();
$bugun = date("w");
for ($i=0; $i<10000; $i++) { $kacgunkaldi = (6-$bugun >= 0) ? 6-$bugun : 6;
}
echo "Cumartesi gününe ".$kacgunkaldi." gün kaldı.";
echo 'Derlenme Süresi: '. timer_stop();
// Derlenme süresi ortalama 0,00894 sn

Testi nasıl uyguladım?

Bunların herbirini bir php dosyasına ekledim ve kendilerini sunucu üstünden çağırdım. Tabi gördüğünüz gibi tarih farkı bulma işlemini for döngüsü ile arka arkaya 10.000 kez uygulatıyoruz. Fakat bu yetmiyor ve sayfa yüklendikten sonra arka arkaya birkaç kez F5 yaptım ve hızlı bir şekilde aynı işlemi tekrar yaptırdım. Böylece daha da yük bindirmiş oldum sunucuya. Bu esnada verebildikleri en küçük süre değerini not aldım. Ve üstteki gibi saniyeler ortaya çıktı.

Hangisinin hızlı olduğu konularda takılınca bu tarz testler uygulamanız faydalı olacaktır bence. Buradan gördüğümüz üzere, switch fonksiyonunun kısayolu (..) ? .. : .. hepsinden daha hızlı, switch ise if fonksiyonundan hızlıdır 😉