[英]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個條目),查找是最快的方法。 這就是哈希表的用途。
首先,您自己進行測試很容易。
其次,更重要的是,哪個最適合您使用的代碼? 在任何情況下,您節省的時間都是微不足道的。
您是在每次構建陣列,還是可以一次構建並緩存它?
如果您每次都在構建它,那么我看不出它會更快。 單獨構建數組所花費的時間要比鏈接的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()
塊要快得多(更不用說輸入所有內容所花的時間了!)
您可以測試該值是否不存在還需要多長時間。 我的猜測是數組鍵查找會更快。 而且,如果必須查詢兩次或更多次,則對數組進行緩存應該可以使其更快。
但是速度並不是這里最重要的。 從長遠來看,陣列鍵對於要添加和刪除數據的情況更好。 您將來也可以從其他來源獲取數據。
這是對數組操作的一點測試
{
$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.