Это может быть глупый вопрос, но как кто-то относительно новичок в 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
Было бы интересно услышать некоторые мнения по этому поводу, даже если просто услышать, что это не имеет значения.
Спасибо.
Ответы:
3 простых правила, которые помогут вам понять:
Проблемы с производительностью понять довольно сложно. Новичкам рекомендуется не учитывать это. Потому что им всегда импонируют мелочи и не замечают действительно важные вещи. Просто из-за отсутствия опыта.
То же самое и с вашим вопросом. Представьте, что вы когда-нибудь почувствуете разницу. Даже большой, скажем, одним способом в 2 раза быстрее. Ой, 2 раза! Я выбрал его и хорошо оптимизировал приложение, теперь оно будет работать на 50% быстрее!
Неправильно . Не 50%. Вы никогда не заметите и даже не заметите этого увеличения скорости. Потому что вы оптимизировали часть, которая занимает всего 0,0001% всего времени выполнения скрипта.
Что касается больших таблиц HTML, браузеру требуется много времени, чтобы отобразить их. Намного больше, чем вам нужно было произвести.
Профилирование - ключевое слово в мире производительности. Можно без сомнений отбросить любой вопрос, связанный с производительностью, если в нем нет слова «профилирование». В то же время профилирование - это не ракетостроение. Я просто измеряю время выполнения различных частей вашего скрипта. Это можно сделать с помощью профилировщика, например xdebug, или даже вручную, используя
microtime(1)
. И только после обнаружения самой медленной части можно приступать к тестам.Научитесь профилировать, прежде чем задавать вопросы о производительности. И научитесь не задавать вопросы о производительности, если для этого нет реальных причин.
Преждевременная оптимизация - корень всех зол, - Д.Кнут .
источник
Я переделал тесты с 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
Поскольку я сомневаюсь, что мне понадобится столько данных за один раз, думаю, я продолжу использовать множество тегов, отступы кода выглядят аккуратнее, а макет просмотра исходного кода - более точным.
источник
echo
принимает несколько выражений для вывода. Ни один вариант с этой функцией не учитывался в метриках.Вы можете легко игнорировать разницу в производительности между этими двумя. С сегодняшними современными вычислительными ресурсами разница действительно не имеет значения. Такого рода печать на экран действительно не о чем беспокоиться. Есть масса других вещей, о которых вам следует подумать раньше. Кроме того, всегда ведутся споры между лучшей производительностью и удобством сопровождения вашего кода. Не всегда удается добиться наилучшего результата. Вместо этого вы всегда должны учитывать проблемы производительности и количество времени, которое вам нужно потратить на их улучшение.
источник
Код, который легко перевести в псевдокод, лучше. Об этом свидетельствуют приведенные выше примеры. Что нужно больше времени, чтобы сказать?
"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."
Техническое объяснение того, как работает интерпретатор и почему один способ быстрее другого, не имеет значения для новичка. Лучше всего просто знать практические правила:
Используйте больше тегов, если общий результат проще. Период.
источник
Настоящая проблема - использование памяти. Конкатенация строк и массовое эхо могут экспоненциально увеличить использование памяти.
Если вы спамите тегом php, ваш код станет нечитаемым.
Лучшее решение - использовать механизм шаблонов и избегать смешивания кода и представления в целом.
источник