Làm cách nào để đo thời gian tải trang (với các câu lệnh PHP khác nhau)?Đo điểm chuẩn trang PHP lần
Hơi giống như số liệu thống kê có sẵn ở đây - http://talks.php.net/show/drupal08/24
Làm cách nào để đo thời gian tải trang (với các câu lệnh PHP khác nhau)?Đo điểm chuẩn trang PHP lần
Hơi giống như số liệu thống kê có sẵn ở đây - http://talks.php.net/show/drupal08/24
Các đơn giản nhất cũng là Apache Bench(gọi tắt là ab
), được cung cấp với Apache:
Dường như phù hợp với loại báo cáo rất đơn giản được trình bày trên trang chiếu của bạn.
(Nó thực sự báo cáo nhiều hơn thế)
Nếu nhu cầu của bạn ar ea cắn phức tạp hơn, Siege có thể là một lựa chọn tốt.
Một điều thú vị với Siege là có thể lấy danh sách URL từ một tệp, thay vì chỉ làm việc với một tệp.
Một điều thú vị với những công cụ này là bạn không phải đo chỉ thời gian thực hiện để thực hiện một phần cụ thể của mã (như bạn sẽ sử dụng nếu microtime
trực tiếp trong mã PHP của bạn), nhưng bạn đang nhận được toàn bộ thời gian đã được yêu cầu để phục vụ trang.
Ngoài ra, nó có thể đo điểm chuẩn nhiều hơn chỉ là mã PHP, vì nó hoạt động trên yêu cầu HTTP và không phải mã.
Bạn có thể sử dụng microtime() khi bắt đầu xử lý và ở cuối đầu ra, sau đó tính chênh lệch và chuyển đổi thành giây nếu muốn.
Điều này sẽ chỉ đo thời gian thực hiện cho phía PHP, không phải toàn bộ thời gian tải trang tại nó có vẻ là trong liên kết của bạn, nhưng nó sẽ giúp bạn so sánh hiệu suất phương thức khác nhau.
phương pháp hai: Đặt các báo cáo tất cả xung quanh bạn kịch bản của bạn
$TIMER['label']=microtime(1);
/* some code */
$TIMER['sql1_before']=microtime(1);
a/* some code */
$TIMER['sql1_after']=microtime(1);
/* some code */
và sau đó xuất nó, với mã như thế này:
echo "<table border=1><tr><td>name</td><td>so far</td><td>delta</td><td>per cent</td></tr>";
reset($TIMER);
$start=$prev=current($TIMER);
$total=end($TIMER)-$start;
foreach($TIMER as $name => $value) {
$sofar=round($value-$start,3);
$delta=round($value-$prev,3);
$percent=round($delta/$total*100);
echo "<tr><td>$name</td><td>$sofar</td><td>$delta</td><td>$percent</td></tr>";
$prev=$value;
}
echo "</table>";
Vì vậy, bạn sẽ nhận được báo cáo về cách mã của bạn đi. hành động này được gọi là profiling
và chiếm vị trí quan trọng nhất trong quy trình tối ưu hóa.
$ time curl http://www.example.com/
Lưu ý rằng yêu cầu này bao gồm cả thời gian chờ của mạng. Nhưng điều đó có thể muốn bạn muốn?
Có nhiều cách để thực hiện việc này. Cá nhân tôi đã là người hâm mộ sử dụng microtime theo cách sau:
// Start of code
$time = microtime(true); // Gets microseconds
// Rest of code
// End of code
echo "Time Elapsed: ".(microtime(true) - $time)."s";
Điều đó sẽ mang đến cho bạn độ chính xác một phần hai giây.
Nếu bạn đang viết các tập lệnh dòng lệnh (như câu đố trên Facebook), bạn có thể sử dụng thời gian.
time php dancebattle.php ~/input.dat
Win
real 0m0.152s
user 0m0.142s
sys 0m0.012s
Tôi quên phương pháp theo dõi thời gian tải trang (từ trình duyệt). Bạn có thể sử dụng tab NET từ Firebug (dành cho Firefox) để thực hiện điều đó. Nó sẽ cho phép bạn xem các tải tệp khác nhau (AJAX, JS, CSS, Hình ảnh, v.v.).
Kết quả trong bản trình bày đó dường như được sao chép từ Siege (http://www.joedog.org/index/siege-home).
Một công cụ khá hữu ích để thực hiện "thế giới thực" thử nghiệm toàn bộ stack ứng dụng của bạn là Firebug (http://getfirebug.com/) và YSlow (http://developer.yahoo.com/yslow/)
Bạn nói rằng bạn muốn đo "lần tải trang" đó là hoàn toàn khác nhau từ
thời gian cần thiết để tạo ra trang (được đo bằng một bộ đếm thời gian nội bộ trong mã PHP của bạn)
và tải nó xuống từ máy chủ (được đo bằng ab)
Thời gian tải trang nên bao gồm thời gian để phân tích HTML và yêu cầu tiếp theo đến máy chủ tìm nạp tất cả nội dung liên quan (tệp javascript , tệp css, hình ảnh, v.v.).
Đo lường điều này thực sự khá khó khăn. Để làm điều đó đúng cách, bạn cần đẩy tất cả phía máy khách logic - thả một cookie javascript được đặt thời gian khi người dùng nhấp vào liên kết hoặc gửi biểu mẫu, sau đó trong trang tiếp theo, sử dụng phương thức onload (kích hoạt sau khi mọi thứ đã tải) so sánh thời gian này với thời gian hiện tại. Sau đó, bạn cần một phương pháp báo cáo số liệu này trở lại máy chủ - bạn có thể sử dụng một yêu cầu Ajax hoặc lưu trữ thời gian trong một cookie khác được trình bày trong yêu cầu tiếp theo.
Lưu ý rằng các tệp do mỗi khách hàng yêu cầu sẽ phụ thuộc vào trạng thái hiện tại của bộ nhớ cache bên trình duyệt.
Nếu bạn có thể tách luồng nhấp chuột khỏi nhật ký, bạn có thể nhận được xấp xỉ tốt bằng cách kiểm tra khoảng thời gian giữa yêu cầu cho loại nội dung văn bản/html và yêu cầu liên tiếp cuối cùng đối với loại nội dung khác với văn bản/html. Nhưng số liệu thống kê của bạn sẽ bị lệch nếu người dùng tương tác với chúng tôi nhiều hơn một cửa sổ trình duyệt đồng thời.
Hãy thử https://github.com/fotuzlab/appgati
Nó cho phép xác định các bước trong các mã và báo cáo thời gian, sử dụng bộ nhớ, tải máy chủ vv giữa hai bước.
Cái gì như:
$appgati->Step('1');
// Do some code ...
$appgati->Step('2');
$report = $appgati->Report('1', '2');
print_r($report);
Mẫu đầu ra mảng:
Array
(
[Clock time in seconds] => 1.9502429962158
[Time taken in User Mode in seconds] => 0.632039
[Time taken in System Mode in seconds] => 0.024001
[Total time taken in Kernel in seconds] => 0.65604
[Memory limit in MB] => 128
[Memory usage in MB] => 18.237907409668
[Peak memory usage in MB] => 19.579357147217
[Average server load in last minute] => 0.47
[Maximum resident shared size in KB] => 44900
[Integral shared memory size] => 0
[Integral unshared data size] => 0
[Integral unshared stack size] =>
[Number of page reclaims] => 12102
[Number of page faults] => 6
[Number of block input operations] => 192
[Number of block output operations] =>
[Number of messages sent] => 0
[Number of messages received] => 0
[Number of signals received] => 0
[Number of voluntary context switches] => 606
[Number of involuntary context switches] => 99
)
Sử dụng microtime() PHP chức năng bạn sẽ biết chính xác bao nhiêu thời gian là cần thiết cho mã PHP của bạn để được thực thi. Thực hiện theo các bước bên dưới để đặt mã PHP trên trang web của bạn:
Đặt mã sau vào đầu trang PHP của bạn (nếu bạn đo thời gian cần thiết cho phần cụ thể của mã đặt ngay trước mã PHP đó phần)
<?php
$time = microtime();
$time = explode(' ', $time);
$time = $time[1] + $time[0];
$start = $time;
?>
các mã sau đây phải được đặt ở cuối của trang web (hoặc sự kết thúc của phần mã PHP)
<?php
$time = microtime();
$time = explode(' ', $time);
$time = $time[1] + $time[0];
$finish = $time;
$total_time = round(($finish - $start), 4);
echo 'Page generated in '.$total_time.' seconds.';
Nếu không hoạt động sử dụng microtime (true) thay vì của microtime()
Đặt mã sau vào đầu trang PHP của bạn.
<?php
$statrttime = microtime();
$time = explode(' ', $statrttime);
$time = $time[1] + $time[0];
$start = $time;
?>
Mã sau phải được đặt ở cuối trang của bạn.
<?php
$endtime = microtime();
$time = explode(' ', $endtime);
$time = $time[1] + $time[0];
$finish = $time;
$total_time = round(($finish - $start), 4);
echo 'Page load in '.$total_time.' seconds.';
?>
Lưu ý: Nếu bạn đo thời gian cho phần cụ thể của mã đặt phần bắt đầu này và phần mã PHP cuối cùng.
... nhưng bạn cần phải ghi lại điều này ở đâu đó để nó có giá trị bất kỳ. – symcbean
chắc chắn, câu hỏi là về đo lường thời gian tải trang để so sánh hiệu suất mã. Trong quy trình gỡ lỗi thuần túy, không cần phải ghi lại, chỉ hiển thị sự khác biệt của hai microtimes trong chân trang của bạn. Để đo hiệu suất toàn cầu, tôi khuyên bạn nên sử dụng công cụ bên ngoài như băng ghế dự bị apache. – Benoit