In thời gian thực hiện của một lệnh shell


88

Có thể in thời gian thực hiện của một lệnh shell với sự kết hợp sau đây không?

root@hostname:~# "command to execute" && echo "execution time"

Câu trả lời:


72

Đừng quên rằng có một sự khác biệt giữa nội trang của bash time(sẽ được gọi theo mặc định khi bạn làm như vậy time command) và /usr/bin/time(sẽ yêu cầu bạn gọi nó theo đường dẫn đầy đủ của nó).

Nội trang timeluôn in ra stderr, nhưng /usr/bin/timesẽ cho phép bạn gửi đầu ra của thời gian tới một tệp cụ thể, vì vậy bạn không can thiệp vào luồng stderr của lệnh đã thực thi. Ngoài ra, /usr/bin/timeđịnh dạng của có thể được định cấu hình trên dòng lệnh hoặc bởi biến môi trường TIME, trong khi timeđịnh dạng nội trang của bash chỉ được định cấu hình bởi TIMEFORMATbiến môi trường.

$ time factor 1234567889234567891 # builtin
1234567889234567891: 142662263 8653780357

real    0m3.194s
user    0m1.596s
sys 0m0.004s
$ /usr/bin/time factor 1234567889234567891
1234567889234567891: 142662263 8653780357
1.54user 0.00system 0:02.69elapsed 57%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (0major+215minor)pagefaults 0swaps
$ /usr/bin/time -o timed factor 1234567889234567891 # log to file `timed`
1234567889234567891: 142662263 8653780357
$ cat timed
1.56user 0.02system 0:02.49elapsed 63%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (0major+217minor)pagefaults 0swaps

Từ man bash: "Biến TIMEFORMAT có thể được đặt thành một chuỗi định dạng chỉ định cách hiển thị thông tin thời gian"
Tạm dừng cho đến khi có thông báo mới.

Rất tiếc - tôi nghĩ rằng có một số cách để định dạng nó, nhưng tôi đã bỏ qua help timevì tôi chỉ liếc qua nó và tôi nghĩ đó là một đối số dòng lệnh. Tôi sẽ cập nhật câu trả lời.
Mark Rushakoff

2
Ở đây chúng ta đã 9 năm sau và lệnh chỉ mất 0m0.018s. Tôi chỉ nghĩ rằng tôi sẽ chỉ ra điều đó.
Ghassen Louhaichi

112

time là một lệnh tích hợp trong hầu hết các shell ghi thông tin thời gian thực thi vào tty.

Bạn cũng có thể thử một cái gì đó như

start_time=`date +%s`
<command-to-execute>
end_time=`date +%s`
echo execution time was `expr $end_time - $start_time` s.

Hoặc trong bash:

start_time=`date +%s`
<command-to-execute> && echo run time is $(expr `date +%s` - $start_time) s

đồng ý với Maaza, tính linh hoạt này cho phép tôi đo thời gian của toàn bộ các lệnh.
Nath

Có thể áp dụng các khía cạnh linux xung quanh bất cứ lệnh linux để thực hiện tính toán
Syed Mazreena

1
Một nhược điểm của phương pháp này là nó đo bằng giây, trong khi timesử dụng mili giây. Và nếu bạn muốn tính thời gian của một số lệnh với nhau mà không cần phải sử dụng các biến và phép tính, bạn có thể sử dụng dấu ngoặc đơn: time ( command1 ; command2 ; command3 )bạn thậm chí có thể tính thời gian riêng lẻ chúng với nhau với tổng thời gian, như vậy: time ( time command1 ; time command2 ; time command3 ) Tất nhiên, nếu bạn muốn khoảng 20 lệnh, có thể tốt hơn để sử dụng giải pháp của câu trả lời này. Nhưng sau đó, bạn nên bắt đầu nghĩ đến việc đặt tất cả các lệnh của mình trong một tập lệnh ...
msb

25
root@hostname:~# time [command]

Nó cũng phân biệt giữa thời gian thực được sử dụng và thời gian hệ thống được sử dụng.


Đó chắc chắn là câu trả lời cơ bản - nhưng có một số phức tạp nếu bạn muốn xem kết quả lỗi từ lệnh và vẫn gửi thông tin thời gian đến đầu ra tiêu chuẩn như câu hỏi. Lệnh thời gian ghi vào stderr. Những gì bạn đề xuất có lẽ đủ chính xác - do đó +1 của tôi.
Jonathan Leffler

2
timeviết cho tty, không phải stderr. Mà tôi đoán làm cho mọi thứ tồi tệ hơn.
đám đông

12

Đối với phép đo delta theo từng dòng, hãy thử gnonom .

Nó là một tiện ích dòng lệnh, giống như ts của moreutils, để thêm thông tin dấu thời gian vào đầu ra tiêu chuẩn của một lệnh khác. Hữu ích cho các quy trình chạy lâu dài nơi bạn muốn ghi lại lịch sử những gì diễn ra trong thời gian dài.

Piping bất kỳ thứ gì đến gnomon sẽ thêm một dấu thời gian vào mỗi dòng, cho biết dòng đó là dòng cuối cùng trong bộ đệm bao lâu - nghĩa là dòng tiếp theo xuất hiện trong bao lâu. Theo mặc định, gnomon sẽ hiển thị số giây trôi qua giữa mỗi dòng, nhưng điều đó có thể định cấu hình.

bản demo gnomon


8

Thêm vào câu trả lời của @ mob:

Bổ sung %Nđể date +%scung cấp cho chúng tôi độ chính xác nano giây:

start=`date +%s%N`;<command>;end=`date +%s%N`;echo `expr $end - $start`

5

Nếu tôi đang bắt đầu một quy trình chạy dài như sao chép hoặc băm và tôi muốn biết sau đó mất bao lâu, tôi chỉ cần làm như sau:

$ date; sha1sum reallybigfile.txt; date

Điều này sẽ dẫn đến kết quả sau:

Tue Jun  2 21:16:03 PDT 2015
5089a8e475cc41b2672982f690e5221469390bc0  reallybigfile.txt
Tue Jun  2 21:33:54 PDT 2015

Được, như được triển khai ở đây, nó không chính xác lắm và không tính được thời gian đã trôi qua. Nhưng nó đơn giản và đôi khi là tất cả những gì bạn cần.


4

Trong zsh bạn có thể sử dụng

=time ...

Trong bash hoặc zsh, bạn có thể sử dụng

command time ...

Những điều này (bởi các cơ chế khác nhau) buộc một lệnh bên ngoài được sử 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.