Открытие / закрытие тегов и производительность? - PullRequest
89 голосов
/ 13 марта 2010

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

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

Спасибо.

Ответы [ 5 ]

84 голосов
/ 13 марта 2010

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

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

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

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

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

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

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

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

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

39 голосов
/ 26 апреля 2010

Я переделал тесты с 50 000 строк и добавил метод multi echo in 1 tag

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>';
    }
}

длительность2: 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>';
    }
}

длительность 3: 27,54640007 секунд

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

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

13 голосов
/ 13 марта 2010

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

5 голосов
/ 06 июня 2012

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

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

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

5 голосов
/ 25 января 2012

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

"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. Если вы не можете вручную написать псевдокод на карточке, это слишком сложно.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...