Mở / đóng thẻ & hiệu suất?


91

Đây có thể là một câu hỏi ngớ ngẩn, nhưng là một người tương đối mới với PHP, tôi tự hỏi liệu có bất kỳ vấn đề nào liên quan đến hiệu suất khi thường xuyên mở và đóng các thẻ PHP trong mã mẫu HTML hay không, và nếu có, thì đâu là phương pháp hay nhất về mặt làm việc với các thẻ PHP?

Câu hỏi của tôi không phải về tầm quan trọng / tính đúng đắn của thẻ đóng, hoặc về loại mã nào dễ đọc hơn loại mã khác, mà là về cách tài liệu được phân tích cú pháp / thực thi và tác động của nó đến hiệu suất.

Để minh họa, hãy xem xét hai thái cực sau:

Kết hợp các thẻ PHP và HTML:

<?php echo
   '<tr>
       <td>'.$variable1.'</td>
       <td>'.$variable2.'</td>
       <td>'.$variable3.'</td>
       <td>'.$variable4.'</td>
       <td>'.$variable5.'</td>
   </tr>'
?>
// PHP tag opened once

Tách thẻ PHP và 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

Sẽ muốn nghe một số quan điểm về điều này, ngay cả khi chỉ nghe rằng nó không có gì khác biệt.

Cảm ơn.


9
Câu hỏi thú vị, +1 cho điều đó. Mặc dù tôi không cảm thấy 2 ví dụ bạn đưa ra là cặp lý tưởng để so sánh, nhưng tôi hiểu ý chính :)
okw

Cảm ơn ... tôi tình cờ đang làm việc với một bảng html lớn vào lúc này và câu hỏi cứ nhìn chằm chằm vào tôi ... ngay cả khi nó hơi lý thuyết.
Tom

Off topic-ish: Bạn nên sử dụng một vòng lặp và một mảng / trình lặp dữ liệu để điền vào bảng.
Decent Dabbler

@fireeyedboy ... chắc chắn rồi, tôi đồng ý, nhưng điều đó không phải lúc nào cũng thực tế. Hoặc yêu cầu nhào lộn khi tìm nạp dữ liệu từ db hoặc cấu trúc HTML không phù hợp với một vòng lặp một cách gọn gàng.
Tom

4
Tôi nghĩ rằng khả năng đọc là điều quan trọng nhất ở đây. Bạn sẽ không thấy bất kỳ sự tăng / giảm lớn nào với những thứ nhỏ nhặt như thế này.
Chuck Le Butt

Câu trả lời:


88

3 quy tắc đơn giản để bạn thực hiện đúng:

  • Không có vấn đề cú pháp nào có thể ảnh hưởng đến hiệu suất. Thao tác dữ liệu không.
  • Nói về hiệu suất chỉ được hỗ trợ với kết quả của việc lập hồ sơ .
  • Tối ưu hóa sớm là gốc rễ của mọi điều xấu xa

Các vấn đề về hiệu suất là khá khó hiểu. Nó được khuyến cáo cho người mới không nên tính đến nó. Bởi vì họ luôn bị ấn tượng với những thứ vặt vãnh và không nhìn thấy những thứ thực sự quan trọng. Chỉ vì thiếu kinh nghiệm.

Tương tự cho câu hỏi của bạn. Hãy tưởng tượng bạn sẽ nhận được sự khác biệt nào đó. Ngay cả một phương pháp lớn, chẳng hạn, một phương pháp nhanh hơn gấp 2 lần. Ôi chao, 2 lần! Tôi chọn nó và tối ưu hóa tốt ứng dụng của mình, nó sẽ chạy nhanh hơn 50% ngay bây giờ!

Sai rồi . Không phải 50%. Bạn sẽ không bao giờ nhận thấy hoặc thậm chí đo được sự gia tăng tốc độ này. Bởi vì bạn đã tối ưu hóa một phần chỉ chiếm 0,0001% thời gian chạy toàn bộ tập lệnh.

Đối với các bảng HTML lớn, phải mất một thời gian dài để trình duyệt hiển thị nó. Nhiều hơn những gì bạn mất để tạo ra.

Hồ sơ là một từ khóa trong thế giới biểu diễn. Người ta có thể bỏ qua bất kỳ câu hỏi nào liên quan đến hiệu suất mà không nghi ngờ gì nếu không có từ "hồ sơ" trong đó. Đồng thời, việc lập hồ sơ không phải là một khoa học về tên lửa. Tôi chỉ đo thời gian chạy của các phần khác nhau trong tập lệnh của bạn. Có thể được thực hiện với một số trình cấu hình, như xdebug, hoặc thậm chí theo cách thủ công, sử dụngmicrotime(1) . Và chỉ sau khi phát hiện phần chậm nhất, bạn mới có thể bắt đầu với các bài kiểm tra.

Tìm hiểu hồ sơ trước khi đặt câu hỏi về hiệu suất. Và học cách không đặt câu hỏi về hiệu suất nếu không có lý do thực sự cho nó.

Tối ưu hóa sớm là gốc rễ của mọi điều xấu - D.Knuth .


4
Tại sao lại tệ như vậy nếu tôi sử dụng từ "điểm chuẩn" thay vì "hồ sơ"? Có sự khác biệt nào về ý nghĩa không? Sẽ đánh giá cao biết sự khác biệt :)
NikiC

+1 cho trích dẫn Donald Knuth và +200 cho câu trả lời rất sâu sắc.
Clement Herreman

@nikic, Col nói từ "điểm chuẩn" là xấu khi nào vậy ?? Nghe có vẻ như bạn đang đưa từ vào miệng anh ấy hoặc đang nói đến điều gì đó không đúng chỗ.
Chuck Le Butt

10
tại sao điều này lại được đánh giá rất cao? Nó không trả lời câu hỏi dưới bất kỳ hình dạng hoặc hình thức nào. -1 từ tôi.
bharal

2
@NikiC Cách sử dụng thông thường mà tôi đã chứng kiến: điểm chuẩn có nghĩa là bằng cách nào đó đo lường hoặc xếp hạng hiệu suất tổng thể của đoạn mã để so sánh nó với các giải pháp thay thế (như những gì Amien đã làm trong câu trả lời của anh ấy cho câu hỏi này, bên dưới), trong khi lập hồ sơ có nghĩa là tìm ra những phần mã của bạn chịu trách nhiệm cho bất kỳ vấn đề hiệu suất mà người dùng có thể nhìn thấy mà bạn đang cố gắng giải quyết. Sự khác biệt là lập hồ sơ là để xác định nguyên nhân của vấn đề hiệu suất của bạn, trong khi đo điểm chuẩn là về việc thử nghiệm các giải pháp cho nó.
Mark Amery

40

Tôi đã thực hiện lại các bài kiểm tra với 50.000 hàng và cũng đã thêm nhiều tiếng vang trong 1 phương pháp thẻ

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

thời lượng1: 31.15542483 Giây

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

thời lượng2: 30.23169804 giây

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

thời lượng3: 27.54640007 giây

Không có nhiều sự khác biệt giữa 2 phương pháp ban đầu, nhưng có vẻ như nó nhanh hơn một chút với ít ghép nối hơn @poke

Vì tôi nghi ngờ mình sẽ cần nhiều dữ liệu này trong một lần sử dụng, tôi đoán tôi sẽ tiếp tục sử dụng nhiều thẻ, thụt lề mã trông gọn gàng hơn và bố cục 'nguồn xem' chính xác hơn


1
Trường hợp thử nghiệm thứ ba sẽ là sử dụng nhiều câu lệnh echo với một thẻ php, vì khi đó bạn sẽ không cần sử dụng nối chuỗi.
poke

Tôi đã làm lại các bài kiểm tra với 50.000 hàng và thêm tiếng vang đa trong 1 phương pháp thẻ quá
Amien

5
+1 Chia lưới rất quan trọng khi chúng tôi muốn tối ưu hóa. Chúng tôi thường nhận ra rằng loại tối ưu hóa này là vô ích.
Luc M

18
Từ giao diện của nó, hai ví dụ đầu tiên xuất ra nhiều khoảng trắng hơn ví dụ cuối cùng. Đó có thể là lý do cho thời gian chạy cao hơn.
Mike C

Cũng echochấp nhận nhiều biểu thức để được xuất. Không có biến thể với tính năng đó đã được xem xét trong các chỉ số.
hakre

13

Bạn có thể dễ dàng bỏ qua sự khác biệt về hiệu suất giữa hai loại đó. Với tài nguyên máy tính hiện đại ngày nay, sự khác biệt thực sự không thành vấn đề. Loại nội dung in ra màn hình này thực sự không phải lo lắng. Có rất nhiều thứ khác mà bạn nên xem xét trước đó. Ngoài ra, luôn có một cuộc tranh luận giữa hiệu suất tốt nhất và khả năng bảo trì mã của bạn. Không phải lúc nào bạn cũng có thể cố gắng đạt được hiệu suất tốt nhất. Thay vào đó, bạn nên luôn xem xét các mối quan tâm về hiệu suất cùng với lượng thời gian bạn cần dành để cải thiện chúng.


6

Mã dễ dịch sang mã giả thì tốt hơn. Điều này được chứng minh qua các ví dụ trên. Cái nào mất nhiều thời gian hơn để nói?

"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..."

Cá nhân tôi sẽ làm:

"Start php, define this, do this 30 times: add this to that.  Print." 

Giải thích kỹ thuật về cách hoạt động của trình thông dịch và lý do tại sao cách này nhanh hơn cách khác là không thích hợp cho người mới. Tốt nhất chỉ nên biết các quy tắc ngón tay cái:

  1. Đơn giản hơn là tốt hơn.
  2. Nếu nó không vừa trên một trang thì nó đang làm quá nhiều (hãy chia nhỏ nó ra).
  3. Nếu bạn không thể viết tay mã giả trên thẻ chỉ mục, nó quá phức tạp.

Sử dụng nhiều thẻ hơn nếu kết quả tổng thể đơn giản hơn. Giai đoạn = Stage.


5

Vấn đề thực sự với điều này là sử dụng bộ nhớ. Việc nối chuỗi và lặp lại khối lượng có thể tăng khả năng sử dụng bộ nhớ theo cấp số nhân.

Nếu bạn spam thẻ php, mã của bạn sẽ không thể đọc được.

Giải pháp tốt nhất là sử dụng công cụ mẫu và tránh trộn lẫn mã và bản trình bày hoàn toàn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.