Открытие/закрытие тегов и производительности?

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

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

Спасибо.

Ответ 1

3 простых правила для правильного выбора:

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

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

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

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

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

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

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

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

Ответ 2

Я переделал тесты с 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 
    }
}

duration1: 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 проход, я думаю, что я продолжу использовать множество тегов, более точный отступ кода и более "верный исходный" формат

Ответ 3

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

Ответ 4

Код, который легко перевести на псевдокод, лучше. Об этом свидетельствуют приведенные выше примеры. Что требует больше времени?

"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." 

Техническое объяснение того, как работает интерпретатор и почему один путь быстрее другого, не имеет отношения к новичкам. Лучше всего знать эмпирические правила:

  • Проще лучше.
  • Если он не помещается на одной странице, он делает слишком много (сломайте его).
  • Если вы не можете вручную записать псевдокод на карточке индекса, это слишком сложно.

Используйте больше тегов, если общий результат проще. Период.

Ответ 5

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

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

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