Làm cách nào để nói lớp nào trong số nhiều lớp (tất cả đều làm cùng một công việc) thực thi nhanh hơn? là có một phần mềm để đo lường điều đó?
Làm cách nào để nói lớp nào trong số nhiều lớp (tất cả đều làm cùng một công việc) thực thi nhanh hơn? là có một phần mềm để đo lường điều đó?
Câu trả lời:
Bạn có (ít nhất) hai giải pháp:
Cái khá "ngây thơ" đang sử dụng microtime (true) trước và sau một phần mã, để biết thời gian đã trôi qua trong quá trình thực thi nó; những câu trả lời khác đã nói điều đó và đã đưa ra ví dụ, vì vậy tôi sẽ không nói nhiều nữa.
Đây là một giải pháp tốt nếu bạn muốn đánh giá một vài hướng dẫn; chẳng hạn như so sánh hai loại hàm - sẽ tốt hơn nếu được thực hiện hàng nghìn lần, để đảm bảo bất kỳ "phần tử nhiễu loạn" nào đều được tính trung bình.
Một cái gì đó như thế này, vì vậy, nếu bạn muốn biết mất bao lâu để tuần tự hóa một mảng:
$before = microtime(true);
for ($i=0 ; $i<100000 ; $i++) {
serialize($list);
}
$after = microtime(true);
echo ($after-$before)/$i . " sec/serialize\n";
Không hoàn hảo, nhưng hữu ích và không mất nhiều thời gian để thiết lập.
Giải pháp khác, hoạt động khá tốt nếu bạn muốn xác định chức năng nào mất nhiều thời gian trong toàn bộ tập lệnh, là sử dụng:
Để có được các tệp cấu hình, bạn phải cài đặt và cấu hình Xdebug; hãy xem trang Cấu hình PHP Scripts của tài liệu.
Những gì tôi thường làm là không bật trình biên dịch theo mặc định (nó tạo ra các tệp khá lớn và làm chậm mọi thứ) , nhưng sử dụng khả năng gửi một tham số được gọi XDEBUG_PROFILE
là dữ liệu GET, để kích hoạt cấu hình chỉ cho trang tôi cần.
Phần liên quan đến hồ sơ của php.ini của tôi trông như thế này:
xdebug.profiler_enable = 0 ; Profiling not activated by default
xdebug.profiler_enable_trigger = 1 ; Profiling activated when requested by the GET parameter
xdebug.profiler_output_dir = /tmp/ouput_directory
xdebug.profiler_output_name = files_names
(Đọc tài liệu để biết thêm thông tin)
Ảnh chụp màn hình này là từ một chương trình C ++ trong KcacheGrind:
(source: sourceforge.net )
Bạn sẽ nhận được điều tương tự với các tập lệnh PHP ;-)
(Ý tôi là với KCacheGrind; WinCacheGrind không tốt bằng KCacheGrind ... )
Điều này cho phép bạn để có được một cái nhìn tốt đẹp của những gì phải mất thời gian trong ứng dụng của bạn - và đôi khi nó chắc chắn là giúp xác định vị trí các chức năng đó đang chậm lại tất cả mọi thứ xuống ^^
Lưu ý rằng Xdebug tính thời gian CPU dành cho PHP; khi PHP đang đợi câu trả lời từ Cơ sở dữ liệu (ví dụ), nó không hoạt động; chỉ chờ đợi. Vì vậy, Xdebug sẽ nghĩ rằng yêu cầu DB không mất nhiều thời gian!
Điều này phải được cấu hình trên máy chủ SQL, không phải PHP, vì vậy ...
Hy vọng điều này là hữu ích :-)
Chúc bạn vui vẻ!
Đối với những thứ nhanh chóng, tôi làm điều này (bằng PHP):
$startTime = microtime(true);
doTask(); // whatever you want to time
echo "Time: " . number_format(( microtime(true) - $startTime), 4) . " Seconds\n";
Bạn cũng có thể sử dụng một hồ sơ như http://xdebug.org/ .
Tôi đã tạo một lớp định thời gian đơn giản, có thể nó hữu ích cho ai đó:
class TimingHelper {
private $start;
public function __construct() {
$this->start = microtime(true);
}
public function start() {
$this->start = microtime(true);
}
public function segs() {
return microtime(true) - $this->start;
}
public function time() {
$segs = $this->segs();
$days = floor($segs / 86400);
$segs -= $days * 86400;
$hours = floor($segs / 3600);
$segs -= $hours * 3600;
$mins = floor($segs / 60);
$segs -= $mins * 60;
$microsegs = ($segs - floor($segs)) * 1000;
$segs = floor($segs);
return
(empty($days) ? "" : $days . "d ") .
(empty($hours) ? "" : $hours . "h ") .
(empty($mins) ? "" : $mins . "m ") .
$segs . "s " .
$microsegs . "ms";
}
}
Sử dụng:
$th = new TimingHelper();
<..code being mesured..>
echo $th->time();
$th->start(); // if it's the case
<..code being mesured..>
echo $th->time();
// result: 4d 17h 34m 57s 0.00095367431640625ms
echo
, không$echo
Cập nhật năm 2020
Đã nhiều năm kể từ lần cuối cùng tôi trả lời câu hỏi này vì vậy tôi nghĩ đây xứng đáng là một bản cập nhật về bối cảnh APM.
Đây là câu trả lời trực tiếp cho câu hỏi của bạn
là có một phần mềm để đo lường điều đó?
Có, có. Tôi đang thắc mắc sao vẫn chưa thấy ai nhắc đến. Mặc dù các câu trả lời được đề xuất ở trên có vẻ tốt để kiểm tra nhanh nhưng không thể mở rộng về lâu dài hoặc cho một dự án lớn hơn.
Tại sao không sử dụng một công cụ Giám sát Hiệu suất Ứng dụng (APM) được xây dựng chính xác cho điều đó và hơn thế nữa. Kiểm tra NewRelic, AppDynamics, Ruxit (tất cả đều có phiên bản miễn phí) để theo dõi thời gian thực thi, sử dụng tài nguyên, thông lượng của mọi ứng dụng ở cấp phương pháp.
Nếu bạn muốn thực hiện thử nghiệm nhanh của một khuôn khổ, bạn có thể đặt trong index.php tập tin
//at beginning
$milliseconds = round(microtime(true) * 1000);
//and at the end
echo round(microtime(true) * 1000) - $milliseconds;
Mỗi lần bạn sẽ nhận được thời gian thực hiện tính bằng mili giây . Bởi vì micro giây không quá hữu ích trong việc thử nghiệm một trường hợp khung.
Gần đây tôi đã sử dụng XHProf http://pecl.php.net/package/xhprof . Ban đầu nó được phát triển bởi Facebook và nó đi kèm với một giao diện web khá.
Tôi muốn chia sẻ với bạn một hàm tự tạo mà tôi sử dụng để đo tốc độ của bất kỳ hàm hiện có nào lên đến 10 đối số:
function fdump($f_name='', $f_args=array()){
$f_dump=array();
$f_result='';
$f_success=false;
$f_start=microtime();
$f_start=explode(' ', $f_start);
$f_start=$f_start[1] + $f_start[0];
if(function_exists($f_name)){
if(isset($f_args[0])&&is_array($f_args[0])){
if($f_result=$f_name($f_args)){
$f_success=true;
}
}
elseif(!isset($f_args[1])){
if($f_result=$f_name($f_args[0])){
$f_success=true;
}
}
elseif(!isset($f_args[2])){
if($f_result=$f_name($f_args[0],$f_args[1])){
$f_success=true;
}
}
elseif(!isset($f_args[3])){
if($f_result=$f_name($f_args[0],$f_args[1],$f_args[2])){
$f_success=true;
}
}
elseif(!isset($f_args[4])){
if($f_result=$f_name($f_args[0],$f_args[1],$f_args[2],$f_args[3])){
$f_success=true;
}
}
elseif(!isset($f_args[5])){
if($f_result=$f_name($f_args[0],$f_args[1],$f_args[2],$f_args[3],$f_args[4])){
$f_success=true;
}
}
elseif(!isset($f_args[6])){
if($f_result=$f_name($f_args[0],$f_args[1],$f_args[2],$f_args[3],$f_args[4],$f_args[5])){
$f_success=true;
}
}
elseif(!isset($f_args[7])){
if($f_result=$f_name($f_args[0],$f_args[1],$f_args[2],$f_args[3],$f_args[4],$f_args[5],$f_args[6])){
$f_success=true;
}
}
elseif(!isset($f_args[8])){
if($f_result=$f_name($f_args[0],$f_args[1],$f_args[2],$f_args[3],$f_args[4],$f_args[5],$f_args[6],$f_args[7])){
$f_success=true;
}
}
elseif(!isset($f_args[9])){
if($f_result=$f_name($f_args[0],$f_args[1],$f_args[2],$f_args[3],$f_args[4],$f_args[5],$f_args[6],$f_args[7],$f_args[8])){
$f_success=true;
}
}
elseif(!isset($f_args[10])){
if($f_result=$f_name($f_args[0],$f_args[1],$f_args[2],$f_args[3],$f_args[4],$f_args[5],$f_args[6],$f_args[7],$f_args[8],$f_args[9])){
$f_success=true;
}
}
}
$f_end=microtime();
$f_end=explode(' ', $f_end);
$f_end=$f_end[1] + $f_end[0];
$f_time=round(($f_end - $f_start), 4);
$f_dump['f_success']=$f_success;
$f_dump['f_time']=$f_time;
$f_dump['f_result']=$f_result;
var_dump($f_dump);exit;
//return $f_result;
}
Thí dụ
function do_stuff($arg1='', $arg2=''){
return $arg1.' '.$arg2;
}
fdump('do_stuff',array('hello', 'world'));
Lợi nhuận
array(3) {
["f_success"]=>
bool(true)
["f_time"]=>
float(0) //too fast...
["f_result"]=>
string(11) "hello world"
}
Nếu đó là thứ có thể được kiểm tra bên ngoài ngữ cảnh Web, tôi chỉ cần sử dụng time
lệnh Unix .
Bạn có thể sử dụng những thứ cơ bản như lưu trữ dấu thời gian hoặc microtime () trước và sau một thao tác để tính thời gian cần thiết. Điều đó dễ thực hiện, nhưng không chính xác lắm. Có thể một giải pháp tốt hơn là Xdebug , tôi chưa bao giờ làm việc với nó nhưng nó có vẻ là trình gỡ lỗi / cấu hình PHP nổi tiếng nhất mà tôi có thể tìm thấy.