열기 / 닫기 태그 및 성능?


91

이것은 어리석은 질문 일 수 있지만 비교적 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

차이가 없다는 것을 듣는 것이라도 이것에 대한 몇 가지 견해를 듣고 싶을 것입니다.

감사.


9
흥미로운 질문입니다. +1. 난 당신이 준 2의 예를 생각하지 않습니다하지만 비교를위한 이상적인 쌍이다, 나는 요점 : 얻을
okw

고마워요 ... 저는 지금 거대한 html 테이블로 작업하고 있는데 질문이 저를 쳐다보고 있습니다 ... 다소 이론적 일지라도 요.

주제에서 벗어남 : 테이블을 채우려면 루프와 데이터 배열 / 반복자를 사용해야합니다.
Decent Dabbler

@fireeyedboy ... 물론, 동의하지만 항상 실용적인 것은 아닙니다. db에서 데이터를 가져올 때 곡예가 필요하거나 HTML 구조가 루프에 깔끔하게 맞지 않습니다.

4
여기서는 가독성이 가장 중요하다고 생각합니다. 이처럼 사소한 것으로 큰 증가 / 감소를 보지 못할 것입니다.
Chuck Le Butt

답변:


88

제대로하기위한 3 가지 간단한 규칙 :

  • 구문 문제는 성능에 영향을 줄 수 없습니다. 데이터 조작이 수행됩니다.
  • 프로파일 링 결과로만 뒷받침되는 성능에 대해 이야기하십시오 .
  • 조기 최적화는 모든 악의 근원입니다

성능 문제는 이해하기 매우 어렵습니다. 초보자는 그것을 고려하지 않는 것이 좋습니다. 그들은 항상 사소한 것들에 감명을 받고 진짜 중요한 것들을 보지 못하기 때문입니다. 경험 부족 때문입니다.

귀하의 질문과 동일합니다. 당신이 어떤 차이를 얻을 것이라고 상상해보십시오. 큰 것조차도 한 가지 방법이 2 배 더 빠릅니다. 오 마이, 2 번! 나는 그것을 선택하고 내 앱을 잘 최적화했습니다. 이제 50 % 더 빠르게 실행됩니다!

틀 렸습니다 . 50 %가 아닙니다. 이 속도 증가를 알아 채거나 측정하지도 않습니다. 전체 스크립트 런타임의 0,0001 % 만 차지하는 부분을 최적화했기 때문입니다.

큰 HTML 테이블의 경우 브라우저 에서 렌더링 하는 데 시간이 오래 걸립니다 . 생성하는 데 걸린 것보다 훨씬 더 많습니다.

프로파일 링은 성능 세계에서 핵심 단어입니다. "프로파일 링"이라는 단어가 없으면 의심 할 여지없이 성능 관련 질문을 폐기 할 수 있습니다. 동시에 프로파일 링은 로켓 과학이 아닙니다. 스크립트의 다른 부분의 런타임을 측정하고 있습니다. xdebug와 같은 일부 프로파일 러를 사용하거나 microtime(1). 그리고 가장 느린 부분을 감지 한 후에 만 ​​테스트를 시작할 수 있습니다.

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

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


4
"프로필"대신 "벤치 마크"라는 단어를 사용하면 왜 그렇게 나쁜가요? 의미에 차이가 있습니까? 차이 : 알고 감사하겠습니다
NikiC

Donald Knuth를 인용하면 +1하고 매우 통찰력있는 답변을 얻으려면 +200입니다.
Clement Herreman 2011

@nikic, Col은 "benchmark"라는 단어를 사용하는 것이 나쁘다고 언제 말했습니까 ?? 그의 입에 말을 넣거나 잘못된 곳에서 무언가를 언급하는 것 같습니다.
Chuck Le Butt

10
이것이 왜 그렇게 높은 평가를 받습니까? 어떤 모양이나 형태로든 질문에 답하지 않습니다. 나에게서 -1.
bharal

2
@NikiC 내가 목격 한 일반적인 사용법 : 벤치마킹 은 대체 솔루션과 비교하기 위해 코드 조각의 전체 성능을 측정하거나 순위를 매기는 것을 의미 하지만 프로파일 링 은 다음을 의미합니다. 해결하려는 사용자가 볼 수있는 성능 문제에 대해 코드의 어떤 부분 이 책임이 있는지 파악합니다 . 차이점은 프로파일 링 은 성능 문제의 원인을 확인하는 것이고 벤치마킹은 솔루션을 테스트하는 것입니다.
Mark Amery 2014

40

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

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


1
세 번째 테스트 사례는 문자열 연결을 사용할 필요가 없기 때문에 하나의 php 태그로 여러 개의 echo 문을 사용하는 것입니다.
찌르기

50,000 행으로 테스트를 다시 수행하고 1 태그 방법에 멀티 에코도 추가했습니다
Amien

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 태그를 스팸하면 코드를 읽을 수 없게됩니다.

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.