2009-07-14 43 views
5

在PHP switch聲明中,是否將更常見的情況置於頂端附近提高性能?在PHP切換語句中,事件的順序是否重要?

例如,假設下面的函數被調用1000次:

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

如果在時代的1000的990的功能被稱爲$ op參數是「登錄」,將性能具有改善case: 'login'以上case 'after_update':switch聲明中?例如,如果$op = login通過,case 'after_update':之後的代碼是否會被忽略?

我已經對這個想法進行了一些非正式測試,但差異可以忽略不計 - 也許是因爲case: 'login'case 'after_update':之後的代碼都是微不足道的。如果有人直接知道答案,我寧願避免設置一個更加廣泛的測試,並且進行非平凡的操作。

這實際上是一個Drupal問題,但我想它可以由任何熟悉PHP優化的人解決。

回答

10

這可能會被稱爲微觀優化。我不相信會有很大的差異。

然而,爲了確實意味着很多,如果你允許的情況下告吹開關罩的邏輯,例如

switch ($var) { 

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

} 

的順序很重要,案件將落空和執行任何代碼,直到它打破了休息。

我不會關心開關盒的速度,除非你說了100個可能的情況。但是如果那樣的話,你可能應該重構你的代碼。

+1

很棒的回答。謝謝! – anschauung 2009-07-14 12:58:44

2

如果您不使用break;來關閉每條語句,PHP將繼續評估個案直到switch塊的結尾,這可能會影響足夠大的塊中的性能。這個順序對於獲得你正在尋找的行爲很重要。

PHP.Net

switch語句執行逐行(實際上是語句語句)。一開始,沒有代碼被執行。只有當找到一個與switch表達式的值匹配的case語句時,PHP纔會開始執行語句。 PHP繼續執行語句,直到切換塊結束,或者第一次看到break語句。如果您沒有在案例的聲明列表末尾寫入break語句,PHP將繼續執行以下案例的聲明。例如:

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

我奉勸不要依賴這種行爲,但並使用break;每個case因爲這將消除一些不確定性,當你以後再次訪問代碼。

0

通常情況下,建議最可能寫的情況下首先,第二個下一個...

但像亞歷克斯寫道,

這很可能將被稱爲 微優化。我不相信 會有很大的差異。

6

您將需要1000多個案例才能發現差異,但是有差別。我寫了一個測試:

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"); 

這是1000萬執行switch語句。輸出是:

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

所以是有區別的,但直到你達到10所萬元執行的順序,這取決於你當然處理器也不會明顯。