[php] 열기 / 닫기 태그 및 성능?

이것은 어리석은 질문 일 수 있지만 비교적 PHP를 처음 접하는 사람으로서 HTML 템플릿 코드에서 PHP 태그를 자주 열고 닫는 데 성능 관련 문제가 있는지 궁금합니다. 그렇다면 가장 좋은 방법은 무엇일까요? 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). 그리고 가장 느린 부분을 감지 한 후에 만 ​​테스트를 시작할 수 있습니다.

성능 질문을하기 전에 프로파일 링을 배우십시오. 그리고 실제 이유가 없다면 성능 질문을하지 않는 법을 배우십시오.

조기 최적화는 모든 악의 뿌리입니다D.Knuth .


답변

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 초

원래의 두 가지 방법 사이에는 큰 차이가 없지만 연결이 적을수록 훨씬 더 빠릅니다 @poke

한 번에 이렇게 많은 데이터가 필요한지 의심스러워서 계속해서 많은 태그를 사용하고 코드 들여 쓰기가 깔끔해 보이고 ‘소스보기’레이아웃이 더 정확 해 보입니다.


답변

이 둘의 성능 차이를 쉽게 무시할 수 있습니다. 오늘날의 최신 컴퓨팅 리소스에서는 그 차이가 실제로 중요하지 않습니다. 이런 종류의 화면에 인쇄하는 것은 정말 걱정할 필요가 없습니다. 이전에 고려해야 할 사항이 많이 있습니다. 그 외에도 코드의 최상의 성능과 유지 관리 가능성 사이에는 항상 논쟁이 있습니다. 항상 최고의 성능을 달성하려고 할 수는 없습니다. 대신 성능 문제를 개선하는 데 필요한 시간과 함께 항상 고려해야합니다.


답변

의사 코드로 변환하기 쉬운 코드가 더 좋습니다. 이것은 위의 예에서 입증됩니다. 어느 것을 말하는 데 시간이 더 걸리나요?

"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. 인덱스 카드에 의사 코드를 직접 쓸 수 없다면 너무 복잡합니다.

전체적인 결과가 더 간단하다면 더 많은 태그를 사용하십시오. 기간.


답변

이것의 진짜 문제는 메모리 사용입니다. 문자열 연결 및 대량 에코는 메모리 사용을 기하 급수적으로 증가시킬 수 있습니다.

php 태그를 스팸하면 코드를 읽을 수 없게됩니다.

가장 좋은 해결책은 템플릿 엔진을 사용하고 코드와 프레젠테이션을 함께 사용하지 않는 것입니다.


답변