การเปิด / ปิดแท็กและประสิทธิภาพ?


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 ตัวอย่างที่คุณให้มาเป็นคู่ที่เหมาะสำหรับการเปรียบเทียบ แต่ฉันก็เข้าใจดี :)
okw

ขอบคุณ ... ฉันบังเอิญทำงานกับตาราง html ขนาดใหญ่ในขณะนี้และคำถามก็จ้องมองมาที่ฉัน ... แม้ว่ามันจะค่อนข้างเป็นทฤษฎีก็ตาม
ทอม

Off topic-ish: คุณควรใช้ลูปและอาร์เรย์ / ตัววนซ้ำของข้อมูลเพื่อเติมข้อมูลในตาราง
Decent Dabbler

@fireeyedboy ... แน่นอนฉันเห็นด้วย แต่นั่นไม่ได้เป็นจริงเสมอไป อาจต้องใช้การแสดงผาดโผนเมื่อดึงข้อมูลจากฐานข้อมูลหรือโครงสร้าง HTML ไม่พอดีกับลูปอย่างเรียบร้อย
ทอม

4
ฉันคิดว่าความสามารถในการอ่านเป็นสิ่งสำคัญที่สุดที่นี่ คุณจะไม่เห็นการเพิ่ม / ลดที่สำคัญใด ๆ กับสิ่งเล็กน้อยเช่นนี้
Chuck Le Butt

คำตอบ:


88

กฎง่ายๆ 3 ข้อเพื่อทำให้ถูกต้อง:

  • ไม่มีปัญหาทางไวยากรณ์ที่อาจส่งผลต่อประสิทธิภาพ การจัดการข้อมูลไม่
  • พูดถึงประสิทธิภาพที่ได้รับการสนับสนุนจากผลของการทำโปรไฟล์เท่านั้น
  • การเพิ่มประสิทธิภาพก่อนวัยเป็นรากเหง้าของความชั่วร้ายทั้งหมด

ปัญหาด้านประสิทธิภาพค่อนข้างยากที่จะเข้าใจ ขอแนะนำสำหรับมือใหม่ไม่ควรคำนึงถึง เพราะพวกเขามักจะประทับใจกับเรื่องเล็ก ๆ น้อย ๆ และมองไม่เห็นสิ่งสำคัญที่แท้จริง เพียงเพราะขาดประสบการณ์

เหมือนกันสำหรับคำถามของคุณ ลองนึกภาพคุณจะได้รับความแตกต่าง แม้แต่วิธีการหนึ่งที่ยิ่งใหญ่เช่นวิธีหนึ่งเร็วกว่า 2 เท่า โอ้ฉัน 2 ครั้ง! ฉันเลือกมันและปรับแต่งแอพของฉันให้ดีมันจะทำงานเร็วขึ้น 50% ทันที!

ผิด ไม่ใช่ 50% คุณไม่เคยสังเกตหรือแม้แต่วัดความเร็วที่เพิ่มขึ้นนี้ เนื่องจากคุณปรับแต่งส่วนที่ใช้เวลาเพียง 0,0001% ของรันไทม์สคริปต์ทั้งหมด

สำหรับตาราง HTML ขนาดใหญ่เบราว์เซอร์ใช้เวลานานในการแสดงผล มากกว่าที่คุณใช้ในการสร้าง

การทำโปรไฟล์เป็นคำสำคัญในโลกแห่งการแสดง เราสามารถทิ้งคำถามที่เกี่ยวข้องกับประสิทธิภาพได้โดยไม่ต้องสงสัยหากไม่มีคำว่า "โปรไฟล์" อยู่ในนั้น ในขณะเดียวกันการทำโปรไฟล์ไม่ใช่วิทยาศาสตร์จรวด ฉันแค่วัดรันไทม์ของส่วนต่างๆของสคริปต์ของคุณ สามารถทำได้กับผู้สร้างโปรไฟล์เช่น xdebug หรือแม้กระทั่งด้วยตนเองโดยใช้microtime(1). และหลังจากตรวจพบส่วนที่ช้าที่สุดแล้วคุณอาจเริ่มต้นด้วยการทดสอบ

เรียนรู้เกี่ยวกับโปรไฟล์ก่อนถามคำถามเกี่ยวกับประสิทธิภาพ และเรียนรู้ที่จะไม่ถามคำถามเกี่ยวกับประสิทธิภาพหากไม่มีเหตุผลที่แท้จริง

เพิ่มประสิทธิภาพก่อนกำหนดเป็นรากของความชั่วร้ายทั้งหมด - D.Knuth


4
ทำไมถึงแย่ขนาดนี้ถ้าฉันใช้คำว่า "Benchmark" แทน "profile" มีความหมายแตกต่างกันหรือไม่? จะชื่นชมเมื่อรู้ความแตกต่าง :)
NikiC

+1 สำหรับการอ้างอิง Donald Knuth และ +200 สำหรับคำตอบที่ลึกซึ้งมาก
Clement Herreman

@nikic Col บอกว่าใช้คำว่า Benchmark ไม่ดีเมื่อไหร่ ?? ฟังดูเหมือนคุณใส่คำพูดเข้าไปในปากของเขาหรืออ้างถึงบางอย่างผิดที่
Chuck Le Butt

10
ทำไมถึงได้รับคะแนนสูงมาก? มันไม่ได้ตอบคำถามในรูปทรงหรือรูปแบบใด ๆ -1 จากฉัน
bharal

2
@NikiC การใช้งานตามปกติที่ฉันเคยเห็น: การเปรียบเทียบหมายถึงการวัดหรือจัดอันดับประสิทธิภาพโดยรวมของโค้ดเพื่อเปรียบเทียบกับโซลูชันทางเลือก (เช่นสิ่งที่ Amien ทำในคำตอบสำหรับคำถามนี้ด้านล่าง) ในขณะที่การทำโปรไฟล์หมายถึงค้นหาว่าส่วนใดของโค้ดของคุณที่รับผิดชอบต่อปัญหาด้านประสิทธิภาพที่ผู้ใช้มองเห็นที่คุณกำลังพยายามแก้ไข ความแตกต่างคือการสร้างโปรไฟล์เป็นเรื่องเกี่ยวกับการระบุสาเหตุของปัญหาประสิทธิภาพของคุณในขณะที่การเปรียบเทียบเป็นเรื่องเกี่ยวกับการทดสอบวิธีแก้ปัญหา
Mark Amery

40

ฉันได้ทำการทดสอบใหม่ด้วย 50,000 แถวและเพิ่มวิธีการหลาย echo ใน 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 
    }
}

ระยะเวลา 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

เนื่องจากฉันสงสัยว่าฉันจะต้องการข้อมูลจำนวนมากนี้ในครั้งเดียวฉันเดาว่าฉันจะใช้แท็กต่อไปการเยื้องรหัสดูดีกว่าและรูปแบบ 'ดูแหล่งที่มา' ที่แม่นยำยิ่งขึ้น


1
กรณีทดสอบที่สามคือการใช้คำสั่ง echo หลายรายการกับแท็ก php เดียวเนื่องจากคุณไม่จำเป็นต้องใช้การต่อสตริง
โผล่

ฉันได้ทำการทดสอบใหม่ด้วย 50,000 แถวและเพิ่มวิธีการหลาย echo ใน 1 แท็กด้วย
Amien

5
+1 Mesuring เป็นสิ่งสำคัญเมื่อเราต้องการเพิ่มประสิทธิภาพ เรามักจะตระหนักว่าการเพิ่มประสิทธิภาพแบบนี้ไม่มีประโยชน์
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.