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


91

これはばかげた質問かもしれませんが、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

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

ありがとう。


9
興味深い質問です。+ 1してください。あなたが挙げた2つの例が比較のための理想的なペアであるとは思いませんが、要点は
わかります

ありがとう...私はたまたま現在巨大なhtmlテーブルで作業していて、質問は私をじっと見つめています...たとえそれがいくぶん理論的であったとしても。
トム・

オフトピックっぽい:テーブルにデータを入力するには、ループとデータの配列/反復子を使用する必要があります。
まともなダブラー

@fireeyedboy ...確かに、私は同意しますが、それが常に実用的であるとは限りません。dbからデータをフェッチするときにアクロバットが必要か、HTML構造がループにうまく収まりません。
トム・

4
ここでは読みやすさが一番重要だと思います。これほど些細なことで大幅な増減が見られることはありません。
チャック・ル・バット、

回答:


88

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

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

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

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

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

大きなHTMLテーブルに関しては、ブラウザがそれをレンダリングするのに長い時間がかかります。生成するために必要な量をはるかに超えています。

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

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

時期尚早の最適化は諸悪の根源である - D.Knuth


4
「プロファイル」ではなく「ベンチマーク」という単語を使用すると、なぜそれほど悪いのですか?意味に違いはありますか?違いを知って
いただければ幸いです

+1はドナルドクヌースを引用し、+ 200は非常に洞察に富んだ回答を引用します。
Clement Herreman、2011

@ nikic、Colはいつ「ベンチマーク」という言葉を使うのが悪いと言ったのですか?彼の口に言葉を入れたり、間違った場所で何かを参照しているように聞こえます。
チャック・ル・バット、

10
なぜこれがそれほど高く評価されているのですか?それはどんな形や形でも質問に答えません。私から-1。
bharal

2
:私が目撃した@NikiC通常の使用状況ベンチマーク手段は何とか測定やランキング、全体的なのに対し、(Amienは以下の、この質問に対する彼の答えに何をしたかのような)代替ソリューションと比較するために、コードの一部のパフォーマンスをプロファイリングする手段をコードのどの部分が、解決しようとしているユーザーから見えるパフォーマンスの問題の原因であるかを見つける。違いは、プロファイリングはパフォーマンスの問題の原因を特定することであり、ベンチマークはソリューションのテストです。
マークアメリー2014

40

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


1
3番目のテストケースは、文字列連結を使用する必要がないため、1つのphpタグで複数のechoステートメントを使用することです。
2010

私は50,000行でテストをやり直し、マルチエコーイン1タグメソッドも追加しました
Amien

5
+1の測定は、最適化するときに重要です。この種の最適化は役に立たないことにしばしば気づきます。
Luc M

18
その外観から、最初の2つの例は、最後の例よりもはるかに多くの空白を出力します。これがランタイムが高くなる理由である可能性があります。
Mike C

echo出力される複数の式も受け入れます。その機能を持つバリアントはメトリックで考慮されていません。
hakre

13

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


6

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

"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. インデックスカードに疑似コードを手書きできない場合は、複雑すぎます。

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


5

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

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.