web-dev-qa-db-ja.com

タグのオープン/クローズとパフォーマンス?

これはばかげた質問かもしれませんが、PHPを比較的初めて使う人として、HTMLテンプレートコードでPHPタグを頻繁に開いたり閉じたりすることでパフォーマンス関連の問題があるかどうか、そしてでは、PHPタグを使用する上でのベストプラクティスは何でしょうか?

私の質問は、終了タグの重要性/正確さ、またはどのタイプのコードが他のコードより読みやすいかについてではなく、ドキュメントがどのように解析/実行され、パフォーマンスにどのような影響があるかについてです。

説明のために、次の2つの極端な例を考えます。

混合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

たとえそれが違いをもたらさないと聞くだけであっても、これについてのいくつかの見解を聞くことに興味があるでしょう。

ありがとう。

90
Tom

あなたがそれを正しくするための3つの簡単なルール:

  • 構文の問題がパフォーマンスに影響を与えることはありません。データ操作は行います。
  • プロファイリングの結果にのみ裏打ちされたパフォーマンスについて話します。
  • 早期の最適化はすべての悪の根源です

パフォーマンスの問題を理解するのは非常に困難です。初心者には考慮しないことをお勧めします。彼らはいつもささいなことに感動し、本当に重要なものを見ることができないからです。経験不足だからといって。

あなたの質問も同じです。あなたがこれまでにいくつかの違いを得ると想像してください。大きなものでも、1つの方法は2倍高速です。ああ、2回!私はそれを選択し、アプリを最適化しました。今では50%速く実行されます!

間違っています。 50%ではありません。この速度の増加に気づいたり、測定したりすることはありません。スクリプトランタイム全体の0,0001%しかかからない部分を最適化したからです。

大きなHTMLテーブルについては、browserがレンダリングするのに長い時間がかかります。生成するのに必要な量をはるかに超えています。

プロファイリングは、パフォーマンスの世界におけるキーワードです。 Wordに「プロファイリング」が含まれていない場合、パフォーマンス関連の質問は間違いなく破棄できます。同時に、プロファイリングはロケット科学ではありません。スクリプトのさまざまな部分の実行時間を測定しているだけです。 xdebugなどのプロファイラーを使用して、またはmicrotime(1)を使用して手動で行うこともできます。そして、最も遅い部分を検出した後でのみ、テストを開始できます。

パフォーマンスに関する質問をする前に、プロファイリングについて学びます。そして、実際に理由がない場合は、パフォーマンスに関する質問をしないようにしてください。

時期尚早な最適化はすべての悪の根源です- D.Knuth

86

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 
    }
}

期間1: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度でこれだけのデータが必要になるとは思えないので、今後も多くのタグを使用し、コードのインデントがより見栄えがよくなり、「ソースの表示」レイアウトがより正確になると思います

40
Amien

これら2つのパフォーマンスの違いは簡単に無視できます。今日の最新のコンピューティングリソースでは、違いは実際には問題になりません。この種類の画面に出力するものは、本当に心配する必要はありません。あなたが前に考慮すべき他のものがたくさんあります。それとは別に、コードの最高のパフォーマンスと保守性の間には常に議論があります。常に最高のパフォーマンスを達成しようとすることはできません。代わりに、パフォーマンスの問題とその改善に費やす必要のある時間を常に考慮する必要があります。

13
pars

擬似コードに簡単に変換できるコードの方が優れています。これは、上記の例で証明されています。言うのに時間がかかりますか?

"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. 1つのページに収まらない場合は、処理が多すぎます(分解)。
  3. インデックスカードに疑似コードを手書きできない場合は、複雑すぎます。

結果全体がより単純な場合は、より多くのタグを使用します。限目。

6
user1168022

これの本当の問題はメモリ使用量です。文字列の連結と大量のエコーにより、メモリ使用量が指数関数的に増加する可能性があります。

Phpタグをスパムすると、コードが読めなくなります。

最善の解決策は、テンプレートエンジンを使用して、コードとプレゼンテーションを完全に混在させないことです。

5
Martien de Jong