Lệnh time trong Linux

Trong khi kiểm tra sự hiệu quả của 1 ứng dụng hay so sánh các giải thuật khác nhau để giải quyết 1 vấn đề, thời gian thực thi rất quan trọng. 1 giải thuật tốt sẽ được thực thi trong 1 lượng thời gian tối thiểu.

Trong bài viết này chúng ta sẽ tìm hiểu cách tính thời gian thực thi của các lệnh trong Linux, thông qua cách sử dụng lệnh time trong Linux.

1. Cài đặt

Mặc định, có 1 ứng dụng time được xây dựng sẵn bên trong Bash shell, ứng dụng này cũng  có chức năng tính toán thời gian thực thi của lệnh trong Linux, nhưng tất cả chỉ dừng lại ở đó, ngoài việc tính toán thời gian thực thi và xuất kết quả ra stdout, nó này không cung cấp cho chúng ta các tùy chọn khác.

Lệnh time mà chúng ta sẽ đề cập trong bài viết này là 1 ứng dụng khác, độc lập với ứng dụng time có sẵn của Bash shell.

Chúng ta tiến hành cài đặt ứng dụng này như sau:

$ yum install -y time

Sau khi cài đặt, ứng dụng time của chúng ta sẽ nằm trong đường dẫn /usr/bin/time.

Lúc này trong hệ thống của chúng ta sẽ có 2 ứng dụng time:

$ time COMMAND => thực thi ứng dụng time có sẵn của Bash shell
$ /usr/bin/time COMMAND => thực thi ứng dụng time vừa cài đặt ở trên

Để nhận biết ứng dụng time trong hệ thống của chúng ta thuộc phiên bản nào, sử dụng lệnh sau:

$ time --help
-bash: --help: command not found
real 0m0.001s
user 0m0.000s
sys 0m0.001s

=> Ứng dụng time có sẵn của Bash shell

Usage: /usr/bin/time [-apvV] [-f format] [-o file] [--append] [--verbose]
       [--portability] [--format=format] [--output=file] [--version]
       [--help] command [arg...]

=> Ứng dụng time được cài mới.

Nếu chúng ta muốn mỗi lệnh gõ lệnh time, hệ thống sẽ thực thi ứng dụng time được cài mới, thay cho phiên bản có sẵn của Bash shell, thì tiến hành cấu hình alias cho time như sau:

alias time='/usr/bin/time'echo "alias time='/usr/bin/time'" >> ./.bashrc

Kiểm tra kết quả:

$ time --help
Usage: /usr/bin/time [-apvV] [-f format] [-o file] [--append] [--verbose]
       [--portability] [--format=format] [--output=file] [--version]
       [--help] command [arg...]

2. Cú pháp

Để so thời gian thực thi của 1 lệnh, chúng ta chỉ cần thêm tiền tố time vào trước lệnh mà chúng ta muốn chạy.

$ time COMMAND

Ví dụ:

$ time ls
test.txt
next.txt
real 0m0.008s
user 0m0.001s
sys 0m0.003s

Trong đó:

  • Real (thời gian thực thi thật) => thời gian từ khi bắt đầu đến khi kết thúc tiến trình. Đây là toàn bộ thời gian được dùng, bao gồm thời gian được dùng bởi các tiến trình khác và thời gian mà tiến trình dùng khi bị chặn ( ví dụ, nếu nó đang đợi các tác vụ I/O  để hoàn thành).
  • User (thời gian người dùng) => là lượng thời gian của CPU dùng trong các mã ở chế độ người dùng (các mã nằm bên ngoài nhân của hệ điều hành) bên trong tiến trình. Đây chỉ là thời gian thực tế của CPU được dùng trong việc thực thi tiến trình. Các tiến trình khác, và thời gian mà các tiến trình này dành khi bị chặn không tính vào con số này.
  • Sys => là lượng thời gian của CPU dùng trong nhân hệ điều hành bên trong quá trình này, tức là thời gian CPU dùng cho các lời gọi hệ thống bên trong nhân hệ điều hành. Giống với thời gian người dùng, giá trị này chỉ là thời gian mà CPU được dùng bởi tiến trình này.

3. Xuất kết quả ra tập tin

Mặc định thì time sẽ xuất kết quả thống kê thời gian thực thi ra stdout, tuy nhiên, chúng ta có thể ghi các thống kê này vào 1 tập tin bằng cách sử dụng tùy chọn -o hoặc –output như sau:

$ time -o output.txt COMMAND
$ time --output=output.txt COMMAND

Để thêm các thống kê thời gian vào tập tin mà không ghi đè lên các thống kê đang có, sử dụng cờ -a hoặc –append cùng với tùy chọn -o như sau:

$ time -a -o output.txt COMMAND

hoặc

$ time --append -o output.txt COMMAND

4. Định dạng kết quả

Chúng ta có thể định dạng kết quả xuất ra bằng cách sử dụng các chuỗi định dạng với tùy chọn -f  hoặc –format trong time.

Các chuỗi định dạng cho thời gian thật (real time), thời gian người dùng (user time), và thời gian hệ thống (system time) như sau:

  • Real time: %e
  • User Time: %U
  • System Time: %S

Bằng việc kết hợp các chuỗi tham số, chúng ta có thể tạo ra 1 kết quả được định dạng như sau:

$ time -f "FORMAT STRING" COMMAND

hoặc

$ time --format="FORMAT STRING" COMMAND

Ví dụ:

$ time -f "Time: %U" uname
Linux
Time: 0.00

Trong ví dụ trên, %U là tham số cho thời gian của người dùng.

Ngoài ra, còn có nhiều chuỗi định dạng khác được hỗ trợ trong time như:

  •  %C => tên và các đối số dòng lệnh của lệnh được tính thời gian.
  • %D => kích thước trung bình của vùng dữ liệu không chia sẻ của tiến trình, tính theo KB (Kilobyte).
  • %E => Thời gian thật được sử dụng bởi tiến trình theo [giờ:]phút:giây
  • %x => Mã trạng thái thoát của lệnh
  • %k => Số tín hiệu được gửi đến tiến trình.
  • %Z => Kích thước trang của hệ thống tính theo byte. Giá trị này là 1 hằng số trên từng hệ thống, và khác nhau giữa các hệ thống với nhau.
  • %W => Số lần tiến trình được hoán đổi ra khỏi bộ nhớ chính.
  • %K =>Lượng bộ nhớ tổng (data + stack + text) trung bình được dùng bởi tiến trình, tính theo KB.

Trong lệnh time, kết quả được định dạng của COMMAND sẽ được xuất ra stdout, và kết quả được định dạng của time sẽ được xuất ra stderr. Chúng ta có thể chuyển hướng các kết quả này như sau:

$ time -f "Time: %U" uname > command_output.txt 2>time.log
$ cat time.log
Time: 0.00
$ cat command_output.txt
Linux

Trong ví dụ trên, 2> là toán tử chuyển hướng lỗi.

Chúng ta kết thúc bài tìm hiểu về lệnh time trong Linux tại đây. Chúc các bạn thành công!

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.