Olguların sırası PHP switch ifadeleri önemli mi?

4 Cevap php

PHP switch tabloların, üst artırmak performansı yakınındaki daha yaygın vaka yerleştirerek nedir?

Örneğin, aşağıdaki işlev 1,000 kere denir ki:

<?php 
function foo_user ($op) {
    switch ($op) {
    	case 'after_update':
    	//Some Stuff
    	case 'login':
    	//Some other Stuff
    }
}

Kez 1.000 990 fonksiyon $ op argüman denir Eğer performans case: 'login' case 'after_update': {içinde [(2)] Yukarıda alarak artıracak, 'login' olduğunu } deyimi? $op = login geçirildi, örneğin, sonra kod case 'after_update': yok olur?

Ben bu fikri üzerine bazı gayri testler ettik, ama fark önemsiz olmuştur - case: 'login' ve case 'after_update': sonra kodu iki önemsiz belki de. Birisi düpedüz cevabını bilen varsa önemsiz olmayan işlemleri ile daha kapsamlı bir testi kurma önlemek için tercih ediyorum.

Bu, özellikle bir Drupal soru, ama PHP optimize aşina olan herkes tarafından ele olabilir düşünün.

4 Cevap

Bu büyük olasılıkla bir mikro optimizasyonu denir olacak. Ben büyük bir fark olacağını sanmıyorum.

Eğer davalar üzerinden düşmesine izin verirseniz Ancak, sipariş örnek, anahtar davanın mantığı bir sürü demek

switch ($var) {

    case 0:
    case 1:
       do_it();
       break;
    case 2:
       do_it_else();
       break;

}

Sırası önemlidir, vaka üzerinden düşmesine ve bir mola vurur kadar herhangi bir kod çalıştırmasına olacaktır.

100 olası durumlarda söylemek vardı sürece, anahtar davanın hızı endişe olmaz. Ama sonra eğer, büyük olasılıkla olurdu kodunuzu refactor.

Sen bir fark için bir sürü 1000'den fazla vaka gerekir, ama evet, bir fark var olacaktır. Ben bir test yazdı:

function test_switch($value) {

  $startTime = time() + microtime();

  for ($i = 0; $i < 10000000; $i++) {

    switch($value) {

    case "abcdefg":
      $j = $j + 1;
      break;
    case "hijklmno":
      $j = $j + 1;
      break;
    }
  }

  $endTime = time() + microtime();

  echo "Total time for argument $value: " . ($endTime - $startTime) . "<br>\n";
}

test_switch("abcdefg");
test_switch("hijklmno");

Yani switch deyimi 10 milyon infaz olduğunu. Çıktısı:

Total time for argument abcdefg: 3.99799704552
Total time for argument hijklmno: 5.38317489624

Yani orada bir fark var, ama tabii işlemci bağlı olarak, 10 milyon infaz sırasına ulaşmak kadar fark olmayacak.

Her ifadeyi kapatmak için break; kullanmak istemiyorsanız PHP yeterince büyük bir blok performansı etkileyebilir switch bloğunun sonuna kadar davaları değerlendirmeye devam edecektir. Sipariş sonra aradığınız davranışını almak için önemli hale gelir.

Dan PHP.Net:

Switch deyimi satır (deyimi ile aslında, deyim) satır yürütür. Başlangıçta, hiçbir kod çalıştırılmaz. Bir case ifadesi anahtar ifadenin değerini eşleşen bir değer bulunursa sadece PHP ifadeleri çalıştırmaya başlar gelmez. PHP switch bloğunun sonuna ya da break ifadesini gördüğü ilk zamana kadar ifadeleri çalıştırmaya devam eder. Bir case ifadesi listenin sonunda break koymazsanız, PHP şu durumda ifadeleri çalıştırmaya devam edecek. Örneğin:

<?php
    switch ($i) {
        case 0:
            echo "i equals 0";
        case 1:
            echo "i equals 1";
        case 2:
            echo "i equals 2";
    }
?>

Gerçi bu davranışa dayanarak karşı dikkatli ve daha sonra kodu tekrar zaman bazı belirsizliği kaldırmak gibi break; her case için kullanmak istiyorsunuz.

Genellikle, büyük olasılıkla case ilk, yanında ikinci bir yazmanız önerilir ...

gibi ama Alex yazdı,

This is likely going to be called a micro optimisation. I don't believe there would be a large difference.