2012-11-13 33 views
0

我和Jim O'Brien做了兩段代碼,它們完全一樣。但哪個更快?以下兩個代碼片段中的哪一個更快,爲什麼?

(該代碼使偶數和奇數的輸入陣列的鍵 - 值對。如果輸入陣列是這樣的:

Array(
    "thirteen", 
    13, 
    "seven", 
    7, 
    ... 
) 

然後輸出數組將成爲這樣:

Array(
    "thirteen" => 13, 
    "seven" => 7, 
    ... 
) 

片段1:

<?php 

$output = array(); 
for ($i = 0; $i < count($input); $i++) { 
    $output[$input[$i]] = $input[++$i]; 
} 

?> 

代碼段2:

<?php 

$output = array(); 
for ($i = 0; $i < count($input); $i += 2) { 
    $output[$input[$i]] = $input[$i + 1]; 
} 

?> 

哪個代碼段更快,爲什麼?

+7

你的個人資料?或者你想要我們這樣做? –

+1

如何配置文件? –

+0

注意在做足夠的操作次數之前的時間(以毫秒爲單位),打印之後的使用時間。但我擔心你在這裏玩納米優化。 –

回答

7

如果您預先計算了count($input)而不是在每次循環出現時都運行它們,那麼它們之間的差異與您節省的成本相比是微不足道的。

就在你給出的兩個之間,第二個更具可讀性,是我會選擇的。效率方面,這不值得打擾。

3

這通常被稱爲微優化。這不值得擔心,因爲兩者之間的任何收益/差異充其量都可以忽略不計。不要擔心這樣的事情,你應該關注可讀性和遵循良好的編碼習慣。此外,作爲Kolink指出上面,你可以再進環獲得計數(的結果),因此你沒有運行每次迭代的不必要的函數調用:

<?php 

$output = array(); 
$count = count($input); 
for ($i = 0; $i < $count; $i++) { 
    $output[$input[$i]] = $input[++$i]; 
} 

?> 
0

的差異可以忽略不計,去爲最可讀的選項。

1

如果PHP將其編譯爲彙編指令,它可能會將它們優化爲一組x86指令(假設您是該架構的基準測試),它們將採用相同數量的CPU週期。

這就是說:

  • 有一個x86指令,以增加/減少一個值。這些可能會用於片段的內部循環命令(即++$i$i + 1)。
  • 在第二個片段中,計算結果$i + 1將在使用後被丟棄,而
  • 第一個片段將保留它。我只能推測,如果生成的指令將它寫回到內存(這將是緩慢的)或保存在一個CPU寄存器(這將是很快)。
  • 關於循環的頭部,片段一會從增加指令中受益,而片段二需要一條增加指令。在現代CPU上,兩者通常只需要一個CPU週期。因此,如果第二個代碼片段未使用內循環中計算的結果,則無關緊要。

在任何情況下,您只能在測量大量樣本時測量差異。如果你真的想知道,你需要一種方法來查看PHP編譯器生成的生成指令。由於代碼非常小,識別循環並根據每個代碼片斷產生的指令計算CPU週期不應太困難(有關如何查找每條指令的週期數的信息,請參見this question)。

相關問題