Làm thế nào để điểm chuẩn hiệu quả của tập lệnh PHP


131

Tôi muốn biết cách tốt nhất để điểm chuẩn các tập lệnh PHP của tôi là gì. Không quan trọng nếu một công việc định kỳ, hoặc trang web hoặc dịch vụ web.

Tôi biết tôi có thể sử dụng microtime nhưng nó có thực sự mang lại cho tôi thời gian thực của tập lệnh PHP không?

Tôi muốn kiểm tra và điểm chuẩn các chức năng khác nhau trong PHP làm điều tương tự. Ví dụ: preg_matchvs strposhoặc domdocumentvs preg_matchhoặc preg numplace vs str numplace`

Ví dụ về một trang web:

<?php
// login.php

$start_time = microtime(TRUE);

session_start(); 
// do all my logic etc...

$end_time = microtime(TRUE);

echo $end_time - $start_time;

Điều này sẽ xuất ra: 0,0146126717 (thay đổi mọi lúc - nhưng đó là lần cuối cùng tôi nhận được). Điều này có nghĩa là phải mất 0,015 hoặc lâu hơn để thực thi tập lệnh PHP.

Có cách nào tốt hơn?


Đọc bài viết này: rakesh.sankar-b.com/2011/01/12/echo-print-which-is-fast-php - Tôi hy vọng nó có ích.
Rakesh Sankar

4
0,015 giây. Tốc độ chớp mắt trung bình của mắt là 0,3 giây. Bạn có thực sự, thực sự, thực sự cần phải cải thiện tốc độ đó, tôi có thể hỏi tại sao không?
Ben

4
@ben đó là một ví dụ, tôi có các trang tải trong 0,8 giây với hơn 50 nghìn khách truy cập mỗi giờ tôi cần đảm bảo trang tải nhanh
eric

8
@MarcB Amazon rõ ràng đã thử nghiệm và thấy rằng sự chậm trễ 100ms gây ra giảm 1% doanh số. Đó có thể là hàng tỷ cho một trang web lớn như Amazon. highscalability.com/ từ
ceejayoz

1
@ceejayoz Vâng, nếu bạn là amazon thì đó là một vấn đề lớn, nhưng nếu bạn không cảnh giác thì chỉ cần theo đuổi thời gian tải trang điên rồ vì lợi ích của nó. Amazon đã làm bài tập về nhà của họ và do đó có thể dễ dàng biện minh cho việc dành X số giờ làm việc để đòi lại doanh số bán hàng giảm xuống. Bài học ở đây là làm bài tập về nhà của riêng bạn!
James Butler

Câu trả lời:


123

Nếu bạn thực sự muốn điểm chuẩn mã thế giới thực, hãy sử dụng các công cụ như XdebugXHProf .

Xdebug rất phù hợp khi bạn làm việc trong dev / staging và XHProf là một công cụ tuyệt vời để sản xuất và nó an toàn để chạy nó ở đó (miễn là bạn đọc hướng dẫn). Kết quả của bất kỳ tải một trang nào sẽ không liên quan như việc xem mã của bạn hoạt động như thế nào trong khi máy chủ bị cản trở để thực hiện hàng triệu thứ khác và tài nguyên trở nên khan hiếm. Điều này đặt ra một câu hỏi khác: bạn có đang tắc nghẽn CPU không? RAM? Tôi / O?

Bạn cũng cần nhìn xa hơn mã bạn đang chạy trong tập lệnh của mình để biết cách tập lệnh / trang của bạn đang được phục vụ. Bạn đang sử dụng máy chủ web nào? Ví dụ, tôi có thể khiến nginx + PHP-FPM thực hiện nghiêm túc việc thực hiện mod_php + Apache, do đó sẽ bị trả về để phục vụ nội dung tĩnh bằng cách sử dụng CDN tốt.

Điều tiếp theo cần xem xét là những gì bạn đang cố gắng tối ưu hóa cho?

  • Là tốc độ mà trang hiển thị trong trình duyệt người dùng là ưu tiên số một?
  • Là nhận được từng yêu cầu đến máy chủ bị loại bỏ càng nhanh càng tốt với mục tiêu tiêu thụ CPU nhỏ nhất?

Cái trước có thể được giúp đỡ bằng cách làm những việc như gzipping tất cả các tài nguyên được gửi tới trình duyệt, nhưng làm như vậy có thể (trong một số trường hợp) đẩy bạn ra xa hơn để đạt được cái sau.

Hy vọng rằng tất cả những điều trên có thể giúp chứng minh rằng thử nghiệm 'phòng thí nghiệm được cách ly cẩn thận sẽ không phản ánh các biến số và vấn đề bạn sẽ gặp phải trong sản xuất và bạn phải xác định mục tiêu cấp cao của mình là gì và sau đó bạn có thể làm gì để đạt được điều đó, trước khi bắt đầu con đường tối ưu hóa vi mô / sớm đến địa ngục .


6
Nếu điều này thực sự trả lời câu hỏi của bạn eric, tôi cảm thấy câu hỏi của bạn được diễn đạt không chính xác (hoặc có thể tôi chỉ đọc sai). Dựa trên câu hỏi của bạn, có vẻ như bạn muốn tách biệt các phương thức khác nhau để thực hiện cùng một thứ trong PHP và xác định cái nào là nhanh nhất. Tuy nhiên, dựa trên các câu trả lời bạn đã chấp nhận và đưa ra tiền thưởng, có vẻ như bạn quan tâm hơn đến việc kiểm tra tải của toàn bộ ngăn xếp web - một điều hoàn toàn khác.
Hẻm núi Alec

Xdebug không hỗ trợ các tập lệnh được mã hóa Ioncube. Làm thế nào để bạn băng ghế dự bị những kịch bản?
BigSack

@BigSack Bạn là người của riêng bạn ở đó, tôi chưa bao giờ thử hồ sơ bất cứ điều gì bị che giấu như thế. Trước tiên tôi nên chụp ảnh với XHProf vì điều đó tương đối dễ dàng để chạy. Bạn có thể thấy rằng IonCube hoàn toàn can thiệp vào bất kỳ trình lược tả không sử dụng nào.
James Butler

1
Tuyên bố Nginx vs Apache là một chút thiên vị. Hầu hết bỏ qua việc AllowOveridekhiến Apache đi qua toàn bộ thư mục cho các tệp .htaccess trên mỗi yêu cầu. Điều này một mình đưa Apache ra khỏi con đường của riêng mình.
B00mer

74

Để đánh giá mức độ kịch bản hoàn chỉnh của bạn chạy trên máy chủ, có rất nhiều công cụ bạn có thể sử dụng. Trước tiên, hãy đảm bảo tập lệnh của bạn (ví dụ preg_match so với strpose) phải xuất kết quả tương tự để đủ điều kiện kiểm tra của bạn.

Bạn có thể dùng:


30

Bạn sẽ muốn xem xét Xdebug và cụ thể hơn là các khả năng định hình của Xdebug .

Về cơ bản, bạn kích hoạt trình hồ sơ và mỗi khi bạn tải một trang web, nó sẽ tạo một tệp bộ nhớ cache có thể đọc được bằng WinCacheGrind hoặc KCacheGrind .

Xdebug có thể hơi khó để cấu hình, vì vậy đây là phần có liên quan của tôi php.iniđể tham khảo:

[XDebug]
zend_extension = h:\xampp\php\ext\php_xdebug-2.1.1-5.3-vc6.dll
xdebug.remote_enable=true
xdebug.profiler_enable_trigger=1
xdebug.profiler_output_dir=h:\xampp\cachegrind
xdebug.profiler_output_name=callgrind.%t_%R.out

Và đây là ảnh chụp màn hình của một .outtệp trong WinCacheGrind :

nhập mô tả hình ảnh ở đây

Điều đó sẽ cung cấp nhiều chi tiết về mức độ hiệu quả của tập lệnh PHP của bạn. Bạn muốn nhắm mục tiêu những thứ mất nhiều thời gian nhất. Ví dụ: bạn có thể tối ưu hóa một chức năng để mất một nửa thời gian, nhưng những nỗ lực của bạn sẽ được phục vụ tốt hơn để tối ưu hóa một chức năng được gọi là hàng chục nếu không phải hàng trăm lần trong khi tải trang.

Nếu bạn tò mò, đây chỉ là một phiên bản cũ của một CMS tôi đã viết cho mục đích sử dụng của riêng tôi.


8
có vẻ rất phức tạp, tôi không hiểu một điều
eric

Phần nào bạn không hiểu? Việc thiết lập hay phân tích dữ liệu?
Hẻm núi Alec

1
Vâng, thiết lập không, nó sẽ không bao giờ hoạt động trên máy chủ của tôi, nhưng dữ liệu, tất cả các hộp nhỏ tôi không thể đọc
eric

13
bởi vì tôi không sử dụng windows
eric

2
+1 cho XDebug + KCacheGrind. Nó thực sự hữu ích và dễ dàng để cài đặt và sử dụng. Tôi đã sử dụng nó trong một thời gian khá lâu, một phần thưởng bổ sung mà bạn nhận được - một phần bạn trở nên quen thuộc với nó, bạn có thể sử dụng KCacheGrind với Valgrind (+ memgrind / callgrind) để ghi lại nhiều ngôn ngữ khác (và không chỉ thời gian CPU).
XzKto

16

Hãy thử https://github.com/fotuzlab/appgati

Nó cho phép xác định các bước trong 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ảng đầu ra mẫu:

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
)

2
Thiết kế giao diện đáng yêu (như tôi thấy bạn là tác giả), grats! (Và cảm ơn vì đã sử dụng tên phương thức "RightCase";) SetMemory()thay vì mixedCase()crap xấu xí nhưng vẫn có mặt ở khắp mọi nơi , dù sao thì thực tế là vô nghĩa trong PHP. Có lẽ bạn đã quá già. ;))
Sz.

1
Hoàn toàn lỗi thời nhưng với một vài phút tôi đã biến nó thành một thứ gì đó tốt đẹp và hữu ích (ngay cả trong các cửa sổ). Tôi sẽ thử xem tôi có thể đưa ra yêu cầu kéo không.
Tomas Gonzalez

7

Tôi muốn xem xét xhprof . Sẽ không có vấn đề gì nếu nó chạy trên cli hoặc thông qua một sapi khác (như fpm hoặc fcgi hoặc thậm chí là mô-đun Apache).

Phần tốt nhất về xhprof là nó thậm chí còn đủ để chạy trong sản xuất. Một cái gì đó không hoạt động tốt với xdebug (lần trước tôi đã kiểm tra). xdebug có tác động đến hiệu suất và xhprof (tôi không nói là không có) quản lý tốt hơn rất nhiều.

Chúng tôi thường xuyên sử dụng xhprof để thu thập các mẫu với lưu lượng truy cập thực và sau đó phân tích mã từ đó.

Nó không thực sự là một chuẩn mực về mặt nó giúp bạn có được thời gian và tất cả những thứ đó, mặc dù nó cũng làm điều đó. Nó chỉ làm cho nó rất dễ dàng để phân tích lưu lượng sản xuất và sau đó đi sâu vào mức chức năng php trong biểu đồ được thu thập.

Khi tiện ích mở rộng được biên dịch và tải, bạn bắt đầu lược tả mã bằng:

xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);

Dừng lại:

$xhprof_data = xhprof_disable();

Sau đó lưu dữ liệu vào một tệp hoặc cơ sở dữ liệu - bất cứ điều gì nổi lên boath của bạn và không làm gián đoạn thời gian chạy thông thường. Chúng tôi không đồng bộ đẩy nó lên S3 để tập trung dữ liệu (để có thể thấy tất cả các hoạt động từ tất cả các máy chủ của chúng tôi).

Các mã trên github chứa một thư mục xhprof_html mà bạn đổ trên máy chủ và với cấu hình tối thiểu, bạn có thể hình dung các dữ liệu thu thập được và bắt đầu khoan xuống.

HTH!


3

Đặt nó trong một forvòng lặp để làm mỗi việc 1.000.000 lần để có được một con số thực tế hơn. Và chỉ bắt đầu bộ hẹn giờ ngay trước mã bạn thực sự muốn điểm chuẩn, sau đó ghi lại thời gian kết thúc ngay sau đó (tức là không khởi động bộ hẹn giờ trướcsession_start() .

Ngoài ra, hãy đảm bảo mã giống hệt nhau cho từng chức năng bạn muốn điểm chuẩn, ngoại trừ chức năng bạn đang định thời gian.

Cách tập lệnh được thực thi (cronjob, php từ dòng lệnh, Apache, v.v.) sẽ không tạo ra sự khác biệt vì bạn chỉ định thời gian chênh lệch tương đối giữa tốc độ của các chức năng khác nhau. Vì vậy, tỷ lệ này nên giữ nguyên.

Nếu máy tính mà bạn đang chạy điểm chuẩn có nhiều thứ khác đang diễn ra, điều này có thể ảnh hưởng đến kết quả điểm chuẩn nếu có sự tăng đột biến trong việc sử dụng CPU hoặc bộ nhớ từ một ứng dụng khác trong khi điểm chuẩn của bạn đang chạy. Nhưng miễn là bạn có nhiều tài nguyên dự phòng trên máy tính thì tôi không nghĩ đây sẽ là một vấn đề.


1

Một khởi đầu tốt là sử dụng xdebugs profiler http://xdebug.org/docs/profiler

Có thể không phải là thứ dễ nhất để thiết lập và sử dụng, nhưng một khi bạn nhận được nó, khối lượng dữ liệu tuyệt đối và dễ xem là không thể thay thế.


0

Eric

Bạn đang tự hỏi mình câu hỏi sai. Nếu tập lệnh của bạn đang thực thi trong ~ 15 mSec thì thời gian của nó phần lớn không liên quan. Nếu bạn chạy trên một dịch vụ chia sẻ thì quá trình kích hoạt hình ảnh PHP sẽ mất ~ 100 mSec, đọc trong tệp tập lệnh ~ 30-50 mSec nếu được lưu trữ đầy đủ trên máy chủ, có thể 1 hoặc nhiều giây nếu được tải từ trang trại NAS phụ trợ. Sự chậm trễ mạng khi tải đồ nội thất trang có thể thêm nhiều giây.

Vấn đề chính ở đây là nhận thức của người dùng về thời gian tải: người đó phải đợi bao lâu giữa khi nhấp vào Liên kết và nhận được một trang được hiển thị đầy đủ. Hãy xem Google Page Speed mà bạn có thể sử dụng làm tiện ích mở rộng Ff hoặc chrome và tài liệu Pagespeed thảo luận sâu về cách có được hiệu suất trang tốt. Thực hiện theo các hướng dẫn này và cố gắng để có được điểm số trang của bạn tốt hơn 90/100. (Trang chủ google đạt 99/100 cũng như blog của tôi). Đây là cách tốt nhất để có được hiệu suất nhận thức tốt của người dùng.


0

Cũng tốt để theo dõi mã PHP của bạn và kiểm tra chéo với liên kết này , để đảm bảo rằng bản thân mã hóa của bạn không có khả năng làm phiền hiệu suất của ứng dụng.

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.