2010-03-13 160 views
84

這可能是一個愚蠢的問題,但作爲PHP相對較新的人,我想知道是否有任何與性能相關的問題頻繁地打開和關閉HTML模板代碼中的PHP標記,如果是這樣,那麼可能是最佳實踐在使用PHP標籤方面?打開/關閉標籤和性能?

我的問題不是關於結束標記的重要性/正確性,還是關於哪種類型的代碼比另一種更易讀,而是關於文檔如何被解析/執行以及它可能對性能產生什麼影響。

爲了說明,請考慮以下兩個極端:

混合PHP和HTML標籤:

<?php echo 
    '<tr> 
     <td>'.$variable1.'</td> 
     <td>'.$variable2.'</td> 
     <td>'.$variable3.'</td> 
     <td>'.$variable4.'</td> 
     <td>'.$variable5.'</td> 
    </tr>' 
?> 
// PHP tag opened once 

分離PHP和HTML標籤:

<tr> 
    <td><?php echo $variable1 ?></td> 
    <td><?php echo $variable2 ?></td> 
    <td><?php echo $variable3 ?></td> 
    <td><?php echo $variable4 ?></td> 
    <td><?php echo $variable5 ?></td> 
</tr> 
// PHP tag opened five times 

是否有興趣在聽到這方面的一些意見後,即使只是聽說它沒有任何區別倫斯。

謝謝。

+9

有趣的問題,+1。雖然我不覺得你給出的兩個例子是比較理想的一對,但我得到了要點:) – 2010-03-13 03:27:53

+0

謝謝......我碰巧正在處理一個大規模的html表格,並且這個問題有點盯着我。 ..即使這是有點理論上的。 – Tom 2010-03-13 03:29:21

+0

Off topic-ish:您應該使用循環和數據的數組/迭代器來填充表格。 – 2010-03-13 03:43:18

回答

80

3條簡單的規則,你得到它的權利:

  • 沒有語法問題可能會影響性能。數據操作確實。
  • 性能說話只支持結果性能分析
  • 過早的優化是所有罪惡

性能問題的根本是相當費解。建議新手不要將其考慮在內。因爲他們總是被微不足道的東西所折服,並且看不到真正重要的東西。只是因爲缺乏經驗。

相同您的問題。想象一下你會得到一些改變。比如說,一個方法的速度要快兩倍。哦,我的,2次!我選擇它並優化我的應用程序,現在它運行速度會提高50%!

錯了。不是50%。你永遠不會注意到甚至不會測量這種速度的增加。因爲您優化了只佔整個腳本運行時間的0.0001%的部分。

至於大的HTML表格,瀏覽器需要很長時間來呈現它。比你創造的要多得多。

性能分析是性能領域的關鍵詞。人們可以毫不懷疑地拋棄任何與性能相關的問題,如果其中沒有「分析」這個詞。與此同時,剖析並不是火箭科學。我只是測量腳本不同部分的運行時間。可以使用一些分析器來完成,比如xdebug,甚至可以使用microtime(1)來手動完成。只有在檢測到最慢的部分後,纔可以開始測試。

在提出性能問題之前學習配置文件。 如果沒有真正的理由,學習不要問性能問題。

不成熟的優化是所有邪惡的根源 - D.Knuth

+4

爲什麼如果我使用「基準」而不是「配置文件」這個詞這麼糟糕?意義有什麼不同?希望知道差異:) – NikiC 2010-10-18 19:19:02

+0

+1引用唐納德克努特和+200非常有見地的答案。 – 2011-05-05 13:41:38

+0

@nikic,Col什麼時候說使用「benchmark」這個詞不好?聽起來像是你把詞語放在嘴裏,或者在錯誤的地方引用某些東西。 – 2011-05-06 10:29:42

13

您可以輕鬆忽略這兩者之間的性能差異。憑藉今天的現代計算資源,差異確實無關緊要。這種印刷到屏幕的東西真的不用擔心。還有很多你應該考慮的其他東西。 除此之外,您的代碼的最佳性能和可維護性之間始終存在爭議。你不能總是試圖達到最佳性能。相反,您應該始終考慮性能問題以及您需要花費的時間來改進它們。

34

我重做測試與50,000行,並在1種標籤方法添加的多回聲太

for ($j=0;$j<30;$j++) { 
    foreach ($results as $key=>$val){ 
    ?> 
     <tr> 
      <td><?php echo $results[$key][0]?></td> 
      <td><?php echo $results[$key][1]?></td> 
      <td><?php echo $results[$key][2]?></td> 
      <td><?php echo $results[$key][3]?></td> 
      <td><?php echo $results[$key][4]?></td> 
      <td><?php echo $results[$key][5]?></td> 
      <td><?php echo $results[$key][6]?></td> 
      <td><?php echo $results[$key][7]?></td> 
      <td><?php echo $results[$key][8]?></td> 
      <td><?php echo $results[$key][9]?></td> 
      <td><?php echo $results[$key][10]?></td> 
      <td><?php echo $results[$key][11]?></td> 
      <td><?php echo $results[$key][12]?></td> 
      <td><?php echo $results[$key][13]?></td> 
      <td><?php echo $results[$key][14]?></td>    
     </tr> 
    <?php 
    } 
} 

工期:31.15542483秒

for ($k=0;$k<30;$k++) { 
    foreach ($results as $key1=>$val1){ 
     echo 
      '<tr> 
       <td>'.$results[$key1][0].'</td> 
       <td>'.$results[$key1][1].'</td> 
       <td>'.$results[$key1][2].'</td> 
       <td>'.$results[$key1][3].'</td> 
       <td>'.$results[$key1][4].'</td> 
       <td>'.$results[$key1][5].'</td> 
       <td>'.$results[$key1][6].'</td> 
       <td>'.$results[$key1][7].'</td> 
       <td>'.$results[$key1][8].'</td> 
       <td>'.$results[$key1][9].'</td> 
       <td>'.$results[$key1][10].'</td> 
       <td>'.$results[$key1][11].'</td> 
       <td>'.$results[$key1][12].'</td> 
       <td>'.$results[$key1][13].'</td> 
       <td>'.$results[$key1][14].'</td>    
      </tr>'; 
    } 
} 

DURATION2:30.23169804秒

for ($l=0;$l<30;$l++) { 
    foreach ($results as $key2=>$val2){  
      echo'<tr>'; 
       echo'<td>'.$results[$key2][0].'</td>'; 
       echo'<td>'.$results[$key2][1].'</td>'; 
       echo'<td>'.$results[$key2][2].'</td>'; 
       echo'<td>'.$results[$key2][3].'</td>'; 
       echo'<td>'.$results[$key2][4].'</td>'; 
       echo'<td>'.$results[$key2][5].'</td>'; 
       echo'<td>'.$results[$key2][6].'</td>'; 
       echo'<td>'.$results[$key2][7].'</td>'; 
       echo'<td>'.$results[$key2][8].'</td>'; 
       echo'<td>'.$results[$key2][9].'</td>'; 
       echo'<td>'.$results[$key2][10].'</td>'; 
       echo'<td>'.$results[$key2][11].'</td>'; 
       echo'<td>'.$results[$key2][12].'</td>'; 
       echo'<td>'.$results[$key2][13].'</td>'; 
       echo'<td>'.$results[$key2][14].'</td>';    
      echo'</tr>'; 
    } 
} 

duration3:27.54640007秒

原來的2種方法之間沒有太大的區別,但是看起來它是用更少的級聯相當快一點@poke

因爲我懷疑我會在1轉到需要這麼多的數據,我想我會繼續使用許多標籤,代碼縮進看起來更整齊,「查看源代碼」佈局更準確

+0

第三個測試用例是將多個echo語句與一個php標籤一起使用,因爲您不需要使用字符串連接。 – poke 2010-04-26 16:42:34

+1

你沒有說你跑了多少次。 – 2010-04-26 16:45:42

+1

非常有趣...感謝您這樣做。 – Tom 2010-04-26 18:11:03

5

易於轉換爲僞代碼的代碼更好。以上例子證明了這一點。哪些需要更長的時間來說?

"Start php, do this 30 times:, then stop php. Print this. Start php, print this, stop php. Print this. Start php, print this, stop php.Print this. Start php, print this, stop php. Print this. Start php, print this, stop php.Print this. Start php, print this, stop php. Print this. Start php, print this, stop php.Print this. Start php, print this, stop php..." 

"Start php, do this 30 times: print this, then add this to that, then add this to that, then add this to that, then add this to that, then add this to that, then add this to that..." 

"Start php, do this 30 times: print this, print this, print this, print this, print this, print this, print this..." 

個人而言,我會做:

"Start php, define this, do this 30 times: add this to that. Print." 

約一個方式如何解釋工作,爲什麼比別人更快的技術說明是無關緊要的新手。最好只知道經驗法則:

  1. 更簡單更好。
  2. 如果它不適合在單個頁面上,那麼它做得太多(分解)。
  3. 如果您不能在索引卡上手寫僞代碼,它太複雜。

如果總體結果更簡單,可以使用更多標籤。期。

5

與此有關的真正問題是內存使用。字符串連接和大量回應可以按指數方式增加內存使用量。

如果您發送垃圾郵件的標籤,您的代碼變得不可讀。

最好的解決方案是使用模板引擎,並避免混合代碼和演示文稿。