2017-01-27 11 views
0

私はいくつかのデータをテーブルの形で私のウェブサイトに追加します。実際にはすべて動作しますが、いくつかの大きなデータのパフォーマンスをテストしたかったのです。それは非常に悪かった。ここに私の結果:phpエコーデータからhtmlパフォーマンスへ

tablesize | time 
----------------- 
10x20  | 0.22s 
100x20 | 3.29s 
1000x20 | 28.75s 

私の質問は、結果と理由を表示するために優れている方法である:

1:

<?php 
    for($i=0; $i<count($array); $i++){ 
     echo "<div id='...' class='...Ä style='...'>" 
     for($i=0; $i<count($array); $i++){ 
      echo "<div style='...'>".array[$i][$j]."</div>"; 
     } 
     echo "</div>"; 
    } 
?> 

2:

<?php 
    for($i=0; $i<count($array); $i++){ 
?> 
     <div id='...' class='...Ä style='...'> 
<?php 
     for($i=0; $i<count($array); $i++){ 
?> 
      <div style='...'> <?php echo array[$i][$j]; ?> </div> 
     <?php } ?> 
     </div> 
<?php } ?> 

たぶん誰かが持っていますいくつかの追加のヒントは、私はデータの視覚化を高速にすることができます。私はいくつかのarticalについてのMySQLの構造を読んで、私は私のDBが正常に見えると信じています。だから私はデータの読みを最適化するために何ができるのですか?

+2

はるかに高速ですを使用するを使用する必要があります...出力1000行は、あなたの答えのために – scaisEdge

+0

おかげで有用ではないようです。もちろん私はデータをページ付けします。私のコードはverry diffrenceのように見えます。私の問題を理解するためのコアコード – nicoschuck

+0

私は答えとしていくつかの簡単な提案を投稿しました – scaisEdge

答えて

1

scaisEdgeが述べたように、データにページを設定します。 さらに、コードを高速化できるいくつかの変更があります。

  1. 数の代わりにポストのforループ
  2. 使用プリインクリメントの外($ fooという)
  3. 利用代わりに "STR" の 'STR' と連結
  4. ここ

が「ベンチマークです「(出力無し):

<?php 
$array = array(); 
for($i = 0; $i < 1000; ++$i){ 
    $array[] = range(0, 20, 1); 
} 

$t = microtime(true); 
for($k = 0; $k < 5000; ++$k){ 
    for($i=0; $i<count($array); $i++){ 
     $a = "<div id='...' class='...Ä style='...'>"; 
     for($j=0; $j<count($array[$i]); $j++){ 
      $a = "<div style='...'>".$array[$i][$j]."</div>"; 
     } 
     $a = "</div>"; 
    } 
} 
echo 'Count and post : ' . (microtime(true) - $t) . "\n"; 


$t = microtime(true); 
for($k = 0; $k < 5000; ++$k){ 
    $c = count($array); 
    for($i=0; $i<$c; $i++){ 
     $a = "<div id='...' class='...Ä style='...'>"; 
     $c2 = count($array[$i]); 
     for($j=0; $j<$c2; $j++){ 
      $a = "<div style='...'>".$array[$i][$j]."</div>"; 
     } 
     $a = "</div>"; 
    } 
} 
echo 'No count and post : ' . (microtime(true) - $t) . "\n"; 


$t = microtime(true); 
for($k = 0; $k < 5000; ++$k){ 
    $c = count($array); 
    for($i=0; $i<$c; ++$i){ 
     $a = "<div id='...' class='...Ä style='...'>"; 
     $c2 = count($array[$i]); 
     for($j=0; $j<$c2; ++$j){ 
      $a = "<div style='...'>".$array[$i][$j]."</div>"; 
     } 
     $a = "</div>"; 
    } 
} 
echo 'No count and pre : ' . (microtime(true) - $t) . "\n"; 


$t = microtime(true); 
for($k = 0; $k < 5000; ++$k){ 
    $c = count($array); 
    for($i=0; $i<$c; ++$i){ 
     $a = '<div id="..." class="...Ä style="...">'; 
     $c2 = count($array[$i]); 
     for($j=0; $j<$c2; ++$j){ 
      $a = '<div style="...">'.$array[$i][$j].'</div>'; 
     } 
     $a = '</div>'; 
    } 
} 
echo 'No count and pre and \' : ' . (microtime(true) - $t) . "\n"; 

// @scaisEdge 
$t = microtime(true); 
for($k = 0; $k < 5000; ++$k){ 
    foreach($array as $subarray){ 
     $a = '<div id="..." class="...Ä style="...">'; 
     foreach($subarray as $v){ 
      $a = '<div style="...">'.$v.'</div>'; 
     } 
     $a = '</div>'; 
    } 
} 
echo 'Foreach : ' . (microtime(true) - $t) . "\n"; 

?> 

この出力:

Count and post : 46.050459861755 
No count and post : 30.590306043625 
No count and pre : 29.880299091339 
No count and pre and ' : 29.930299043655 
Foreach : 29.120290994644 

見た目に変わったように、「よりも遅いようです」 PHPをチェックし、「文字列変数の内側と「文字列のに対し、それを置き換えるだけで...文字列です。何の操作は行われません。

この遅さの誰かのアイデアを持って?

+0

あなたの時間の結果によって答えとprovementに感謝します。私はforeachにループを変更しました。ブラウザは今半分の時間しか必要としません。あなたはforeachがループのように速いのはなぜですか、あるいはあなたにはそのようなものがあります。私は何が起こったのか理解したいと思う – nicoschuck

+0

scaisEdgeとして彼のポストのコメントに、PHPは配列の内部配列イテレータを使用します。技術的に速いです。私はzend engineのこの部分を研究していないので、もっと正確に説明することはできません。 – zenko

1

大出力の場合、あなたは、ページネーションを使用する必要があります...出力1000行が役に立たないように見える あなたの結果を改ページすると、最後のものと同じになります。

しかし、あなたはコードのために何かできることがあります。ループの の代わりにfor($i=0; i<count($array); $i++){

あなたが

$numElem =count($array); 
for($i=0; $i<$numElem; $i++){ 
    ....... 
} 

または

foreach ($array as $key => $value){ 
    ...... 
} 

これらはあなたがページネーションを使用する必要があり、大出力のための

+0

Foreachがより高速であるようです。私のポストの "ベンチマーク"を参照してください: 'Foreach:29.120290994644' – zenko

+1

@zenkoはtipcally foreach siの方が速いです。foreachはイテレータを使用します.. – scaisEdge

+0

あなたのサポートに感謝します。それは多くの助けとなりました。 – nicoschuck