簡體   English   中英

數組查找(包括數組構建)或IF堆棧更快嗎?

[英]What's quicker, an array lookup (including array build) or an IF stack?

我想知道哪個更好:

$lookup = array( "a" => 1, "b" => 2, "c" => 3 );
return $lookup[$key];

要么

if ( $key == "a" ) return 1
else if ( $key == "b" ) return 2
else if ( $key == "c" ) return 3

或者只是一個不錯的選擇...

switch($key){
case "a": return 1;
case "b": return 2;
case "c": return 3;
}

我總是更喜歡第一種方法,因為我可以將數據與代碼分開。 在這種規模下,它看起來很愚蠢,但在更大范圍內卻具有成千上萬的查找條目。 PHP將花多長時間構建一個數組,然后每個請求僅檢查1或2個條目。

我認為必須對其進行測試和計時,但我要說的是,陣列越大,越復雜,它將變得越慢。

PHP應該比PHP代碼中的查詢處理速度更快,但是首先構建數組肯定會占用很多時間。

對於性能可衡量的任何事物(不僅只有3個條目),查找是最快的方法。 這就是哈希表的用途。

首先,您自己進行測試很容易。

其次,更重要的是,哪個最適合您使用的代碼? 在任何情況下,您節省的時間都是微不足道的。

您將不得不測試找到一個轉折點。 我的猜測是,如果有3個項目,則最好使用if / then / else。 這是一篇有關位計數的不錯的文章 ,該文章比較了計算位數和使用查找的情況。 劇透:勝出!

您是在每次構建陣列,還是可以一次構建並緩存它?

如果您每次都在構建它,那么我看不出它會更快。 單獨構建數組所花費的時間要比鏈接的if()s花費的時間更長(向數組中添加一項會及時接近一個if(),但是當您可以退出if時,您必須添加每一項) ()早)

如果您可以使用緩存的數組,那么我認為那將是明顯的贏家。

因此,我對該示例進行了一些測試,並獲得了以下結果:

emptyfunction:  0.00000087601416110992430969503855231472755349386716
lookuparray:    0.00000136602194309234629100648257538086483009465155
makearrayonly:  0.00000156002373695373539708814922266633118397294311
makearray:      0.00000174602739810943597796187489595842734502184612
ifblock:        0.00000127001986503601083772739543942265072473674081
switchblock:    0.00000131001937389373773757957151314679222764425504

每個方法都在一個方法內部,所以我還包括了一個空方法的時間。 它們分別運行1,000,000次,然后取平均值。

實際上,僅執行查找(不構建數組)要比if塊(使用與我的代碼相同的全局查找)要慢,並且比switch塊要慢一點。

我不必為將它擴展到數百條if語句而煩惱,但這僅表明if語句即使在此級別下,對於一次查找也更快。

如果您有成千上萬的條目,那么數組查找將很容易。 關聯數組可能會有點慢,但是找到一個數組鍵比執行數千個if()塊要快得多(更不用說輸入所有內容所花的時間了!)

您可以測試該值是否不存在還需要多長時間。 我的猜測是數組鍵查找會更快。 而且,如果必須查詢兩次或更多次,則對數組進行緩存應該可以使其更快。

但是速度並不是這里最重要的。 從長遠來看,陣列鍵對於要添加和刪除數據的情況更好。 您將來也可以從其他來源獲取數據。

  • 如果只想查找一個值,則使用數組。
  • 如果要采取措施,則if和switch都有其用途。

這是對數組操作的一點測試

{
    $x = 0;
    foreach ($test as $k => $v) {
        $x = sprintf(” % s=>%sn”,$k,$v);}
}
{
    $x = 0;
    reset($test);
    while (list($k, $v) = each($test)) {
        $x = sprintf(” % s=>%sn”,$k,$v);
     }
}
{
    $x = 0;
    $k = array_keys($test);
    $co = sizeof($k);
    for ($it = 0; $it < $co; $it++) {
        $x = sprintf(” % s=>%sn”,$k[$it],$test[$k[$it]]);
     }
}
{
    $x = 0;
    reset($test);
    while ($k = key($test)) {
        $x = sprintf(” % s=>%sn”,$k,current($test)); next($test);
     }
}

訪問時間(毫秒)
8.1222
10.3221
9.7921
8.9711

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM