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

91

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

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

Спасибо.

Том
источник
9
Интересный вопрос, +1 за это. Хотя я не считаю, что приведенные вами 2 примера являются идеальной парой для сравнения, я
уловил
Спасибо ... Я сейчас работаю с огромной таблицей html, и вопрос как бы смотрит на меня ... даже если это несколько теоретически.
Tom
Не по теме: вы должны использовать цикл и массив / итератор данных для заполнения таблицы.
Decent Dabbler
@fireeyedboy ... конечно, согласен, но это не всегда практично. Либо требуется акробатика при извлечении данных из базы данных, либо структура HTML не вписывается в цикл аккуратно.
Tom
4
Думаю, здесь важнее всего удобочитаемость. Вы не увидите значительного увеличения / уменьшения в такой тривиальной ситуации.
Чак Ле Батт

Ответы:

88

3 простых правила, которые помогут вам понять:

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

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

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

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

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

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

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

Преждевременная оптимизация - корень всех зол, - Д.Кнут .

Ваш здравый смысл
источник
4
Почему так плохо, если я использую слово «тест» вместо «профиль»? Есть ли разница в смысле?
Был
+1 за цитату Дональда Кнута и +200 за очень проницательный ответ.
Клемент Херреман
@nikic, когда Кол сказал, что плохо употреблять слово "эталон" ?? Похоже, вы вкладываете ему в рот слова или ссылаетесь на что-то не в том месте.
Чак Ле Батт
10
почему это так высоко оценено? Он не отвечает на вопрос ни в какой форме. -1 от меня.
bharal 06
2
@NikiC Обычное использование, свидетелем которого я стал: бенчмаркинг означает какое- то измерение или ранжирование общей производительности фрагмента кода, чтобы сравнить его с альтернативными решениями (например, что сделал Амьен в своем ответе на этот вопрос ниже), тогда как профилирование означает выяснение, какие части вашего кода отвечают за любую видимую пользователю проблему производительности, которую вы пытаетесь решить. Разница в том, что профилирование - это определение причины вашей проблемы с производительностью, а сравнительный анализ - это проверка ее решений.
Марк Эмери
40

Я переделал тесты с 50000 строк и добавил метод тега multi echo in 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 секунд

Не большая разница между двумя исходными методами, но похоже, что это немного быстрее с меньшим количеством конкатенаций @poke

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

Амьен
источник
1
Третий тестовый пример - использовать несколько выражений echo с одним тегом php, так как тогда вам не нужно будет использовать конкатенацию строк.
тык
Я переделал тесты с 50 000 строками и добавил метод мультиэха в 1 теге
Амьен,
5
+1 Измерение важно, когда мы хотим оптимизировать. Мы часто понимаем, что такая оптимизация бесполезна.
Luc M
18
Судя по всему, первые два примера выводят гораздо больше пробелов, чем последний пример. Это могло быть причиной более высокой продолжительности работы.
Mike C
Также echoпринимает несколько выражений для вывода. Ни один вариант с этой функцией не учитывался в метриках.
hakre
13

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

парсы
источник
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. Если он не помещается на одной странице, значит, он делает слишком много (разбейте его на части).
  3. Если вы не можете вручную написать псевдокод на карточке, это слишком сложно.

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

Джон Эгертон
источник
5

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

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

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

Мартьен де Йонг
источник