Tips: Cách đơn giản để bench-mark được thời gian chạy của hàm trong PHP

Spread the love

Thường thì khi thực hiện một đoạn code để tối ưu ta cần có các công cụ để cân đo đong đếm thời gian chạy, cũng như số memory consumed của đoạn code đó.

Hôm nay, mình giới thiệu 1 hàm của PHP hỗ trợ để đo thời gian chạy của Code PHP

(Thật ra không hẳn là đo, nhưng dựa vào nó ta có thể viết code đo thời gian thực thi, lượng memory bị consume một cách dễ dàng )

đó là hàm register_shutdown_function.

  1. Sơ lược về hàm này :
    Có thể tham khảo trên PHP http://php.net/manual/en/function.register-shutdown-function.php
    Hàm này sẽ đăng kí một callbacks và được gọi khi việc thực thi script kết thúc hoặc lệnh exit() được gọi
  2. Thử vào code đoạn code bên dưới
print_r(vietISMaxEmployeeYear($arrInYear, $arrOutYear));
register_shutdown_function('shutdown');
function shutdown()
{
 echo 'Script executed with success', PHP_EOL;
}

Chạy thử thì được kết quả

Ồ vậy là script ăn rồi, h thử truyền thêm params coi có được hông nhe. Thử sửa lại thành đoạn bên dưới

$time = microtime(true);
print_r(vietISMaxEmployeeYear($arrInYear, $arrOutYear));
register_shutdown_function('shutdown', $time);
function shutdown($time)
{
    echo 'Run time:' . (microtime(true) - $time) * 1000 . 'ms', PHP_EOL;
}

Chạy thử phát xem có hiện ra hông

Ồ ra kết quả chạy này

(Đoạn trên nhân 1000 rồi thì đơn vị là secs nhé)

Nhưng cái này mới để cho đoạn script php thôi, giờ làm thế nào vứt vào bên trong 1 class nhỉ ???

Vd như vầy nhé, mình muốn đo thử thời gian từ khi user đăng kí xong đến khi mở lại trang thì sẽ như thế nào

Mình phải vứt nó vào AuthController.php nhưng ở chỗ nào nhỉ ? Hay là thử vứt vào _construct xem , ở trên thì mình khai báo một hàm nằm ở ngoài, bây giờ phải khai báo bên trong class, dùng từ khóa $this để chỉ định thử xem sao

 public function __construct()
 {
   $this->middleware('guest', ['except' => 'getLogout']);
   $time = microtime(true);
   register_shutdown_function(array($this, 'benchmark'), $time);
 }

Đoạn trên mình sẽ lấy $time lúc laravel new controller. Giờ thì chỉ cần implements hàm benchmark

 private function benchmark($time) {
     $log = sprintf("Memory: %s / %s bytes\nTime: %f ms\nDeclared: %d classes\nIncluded: %d files > include_files.txt\n",
     number_format(memory_get_usage()),
     number_format(memory_get_peak_usage()),
     (microtime(true) - $time),
     count(get_declared_classes()),
     count(get_included_files())
   );
     file_put_contents( 'D:\something.txt', $log);
 
 }

Đoạn này sẽ gọi hàm bench_mark và output ra file something.txt , thử chạy xem nào

…..

……

Không có file gì hiện ra cả , trống hoác.

Điều gì đã xảy ra nhỉ ??

À, do callnbacks được đăng kí trong register_shutdown_function phải là một hàm gọi được từ bên ngoài, mà chúng ta lỡ đăng kí thành private mất rồi

Thử sửa lại xem thành hàm public thì như thế nào

 public function benchmark($time) {
     $log = sprintf("Memory: %s / %s bytes\nTime: %f ms\nDeclared: %d classes\nIncluded: %d files > include_files.txt\n",
     number_format(memory_get_usage()),
     number_format(memory_get_peak_usage()),
     (microtime(true) - $time),
     count(get_declared_classes()),
     count(get_included_files())
   );
     file_put_contents( 'D:\something.txt', $log);
 
 }

Ô lạ chưa kìa, ra file rồi này

Vậy là chúng ta đã chạy được rồi 😀

Bây giờ nếu thử đăng kí xem nó PHP chạy hết bao lâu

Thử fill đoạn bên dưới vào form

Xong click submit : Kết quả như bên dứoi

ồ vậy là tốn đến 1.23s để xử lý request này. Vậy là sau này chúng ta có thể tự bench mark code của mình hay, dở ở điểm nào rồi 😀