2010-03-13 4 views
84

Это может быть глупый вопрос, но, как кто-то, относительно новый для PHP, мне интересно, есть ли какие-либо проблемы, связанные с производительностью, для частого открытия и закрытия PHP-тегов в HTML-шаблоне кода, и если да, то какие могут быть лучшие практики с точки зрения работы с тегами 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 

было бы интересно выслушав некоторые взгляды на это, даже если он просто услышит, что он не отличается Renče.

Спасибо.

+9

Интересный вопрос, +1 для этого. Хотя я не чувствую, что два примера, которые вы дали, являются идеальной парой для сравнения, я получаю gist :) –

+0

Спасибо ... Я, случается, работаю с массивной html-таблицей в данный момент, и вопрос вроде смотрит на меня. .. даже если это несколько теоретически. – Tom

+0

Off topic-ish: вы должны использовать цикл и массив/итератор данных для заполнения таблицы. –

ответ

80

3 простых правил для вас, чтобы получить это право:

  • Ни один вопрос синтаксиса не может повлиять на производительность. Обработка данных делает.
  • Говорите о производительности только с результатами профилирование.
  • Преждевременная оптимизация является корнем всех злых

проблем производительности довольно трудно понять. Рекомендуется, чтобы новички не учитывали это. Потому что они всегда впечатлены мелочами и не видят реальных важных вещей. Просто из-за отсутствия опыта.

То же самое и на ваш вопрос. Представьте, что вы когда-нибудь получите какую-то разницу. Даже большой, скажем, один метод в 2 раза быстрее. О, мой, 2 раза! Я выбираю его и оптимизировал свое приложение, он будет работать на 50% быстрее!

Неверный. Не 50%. Вы никогда не заметили бы и не измеряли бы это увеличение скорости. Потому что вы оптимизировали часть, которая занимает всего 0,0001% всего времени исполнения скрипта.

Что касается больших таблиц HTML, то для отображения этого изображения требуется браузер. Гораздо больше, чем вы взяли, чтобы произвести.

Профилирование - ключевое слово в мире исполнения. Нельзя сомневаться в любом вопросе, связанном с производительностью, если в нем нет слова «профилирование». В то же время профилирование - это не наука о ракете. Я просто измеряю время выполнения различных частей вашего скрипта. Может быть сделано с некоторым профилировщиком, например, xdebug или даже вручную, используя microtime(1). И только после обнаружения самой медленной части вы можете начать с тестов.

Учиться профилю, прежде чем задавать вопросы о производительности. И научитесь не задавать вопросы производительности, если для этого нет реальных причин.

Преждевременная оптимизация - вот корень всех зол - D.Knuth.

+4

Почему это так плохо, если я использую слово «benchmark» вместо «profile»? Есть ли разница в значении? Хотелось бы знать различия: – NikiC

+0

+1 для цитирования Дональда Кнута и +200 за очень проницательный ответ. –

+0

@nikic, Когда Кол сказал, что было плохо использовать слово «бенчмарк»? Похоже, вы вкладываете слова в свой рот или ссылаетесь на что-то не в том месте. –

13

Вы можете легко игнорировать разницу в производительности между этими двумя. С сегодняшними современными вычислительными ресурсами разница действительно не имеет значения. Этот вид материалов, отпечатанных на экране, действительно не стоит беспокоиться. Есть тонны других вещей, которые вы должны рассмотреть раньше. Кроме того, всегда существует дебаты между максимальной производительностью и ремонтопригодностью вашего кода. Вы не всегда можете добиться максимальной производительности. Вместо этого вы всегда должны учитывать проблемы с производительностью, а также количество времени, которое вам нужно потратить на их улучшение.

34

Я переделано тесты с 50000 строк и добавил мульти эхо в 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 ход, я думаю, я буду продолжать использовать много тегов, отступы кода выглядят более аккуратно, а макет «view source» более точный

+0

Третьим тестовым случаем было бы использование нескольких инструкций эха с одним тегом php, так как тогда вам не нужно было бы использовать конкатенацию строк. – poke

+1

вы не сказали, сколько раз вы его запускали. –

+1

Очень интересно ... спасибо за это. – Tom

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

Настоящая проблема заключается в использовании памяти. Конкатенация строк и массовое эхо-сигналы могут увеличить использование памяти экспоненциально.

Если вы спамеруете тег php, ваш код становится нечитаемым.

Лучшее решение - использовать механизм шаблонов и вообще не смешивать код и презентацию.

Смежные вопросы