Làm cách nào để có thời gian thực hiện Bash tính bằng mili giây trong Mac OS X?


12

Tôi đã kiểm tra cái này , nhưng giải pháp được cung cấp không hiệu quả với tôi.

Sử dụng ngày tôi có thể nhận được thời gian thực hiện trong vài giây:

T="$(date +%s)"
#some work here
T="$(($(date +%s)-T))"
echo "execution time (secs) ${T}"

Tuy nhiên, khi tôi thử điều này:

T="$(date +%s%N)"
#some work here
T="$(($(date +%s%N)-T))"

Thêm% N (như trên) vào ngày để có độ chính xác nano giây tôi nhận được lỗi sau: -bash: 1369320760N: giá trị quá lớn đối với cơ sở (mã thông báo lỗi là "1369320760N")

Có ai biết cách đo thời gian thực hiện tính bằng mili giây bằng cách sử dụng bash trong Mac OS X không?


Bạn có thực sự cần độ phân giải nano giây? Mà cách tiếp cận này bạn có rất nhiều chi phí. Với # some work hereommited, tôi nhận được thời gian từ 0,2 đến 0,3 giây - mức không nên (hoặc ít nhất là không đổi) để đạt được mục tiêu của bạn. Trong khi đó, /usr/bin/time usleep 50000thời gian ổn định là 0,05 +/- 0,01 giây. (Chỉ được thử nghiệm trong Linux, không biết nếu / usr / bin / time và / hoặc
us ngủ

Bạn có chắc độ phân giải đồng hồ bên trong cung cấp độ phân giải CHÍNH XÁC xuống mức nano giây không?
mdpc

Câu trả lời:


14

Vì OSX là một hệ thống BSD-ish, nên thư viện strftime không có %N( http://www.freebsd.org/cgi/man.cgi?query=date )

timeLệnh bash dựng sẵn có cung cấp cho bạn thông tin bạn cần không?

time some work here

2
cảm ơn vì đã làm cho nó rõ ràng, thời gian hoạt động hoàn hảo và đưa ra ba kết quả, nhưng tôi cần phải làm việc cụ thể với thời gian ban đầu và cuối cùng.
pacodelumberg

11

Tôi sẽ đi theo con đường này nếu tôi cần một phần nghìn giây và BSD không hỗ trợ ngày +%s%N

perl -MTime::HiRes -e 'printf("%.0f\n",Time::HiRes::time()*1000)'

cảm ơn!!! Đó là giải pháp mà không ai báo cáo xung quanh ...
Daniele B

3

echo $(($(date +%s%N)/1000000))

Điều này sẽ chuyển đổi từ nano giây sang mili giây.

Từ @mpy, date +%s.%Nhoạt động.

Đầu ra khác nhau giữa linux và OS X:
linux: 1369322592.573787111
OS X:1369322610.N


Tôi đang gặp lỗi sau: -bash: 1369321446N: giá trị quá lớn đối với cơ sở (mã thông báo lỗi là "1369321446N") điều này không hoạt động trong mac osx, tôi nhận được:
pacodelumberg

Chà, thật khó chịu ... (đã kiểm tra trên cửa sổ sai) thấy lỗi tương tự: /
demure

1
Không cần phân chia đầu ra, chỉ cần sử dụng date +%s.%N(nhưng tôi không thể kiểm tra OSX; nó hoạt động trên Linux). Nhưng vấn đề là sau đó, rằng bash's $(( ))IMHO không có khả năng xử lý các số dấu chấm động.
mpy

@mpy Điều đó hoạt động trên osx. Mặc dù trong 10 ký tự đầu tiên, hoạt động khác nhau giữa linux và OS X.
demure

Điều đó có nghĩa là chúng ta không thể có được thông tin nano giây bằng cách sử dụng ngày?
pacodelumberg

3

Nếu bạn cài đặt, coreutilsbạn có thể sử dụng GNU Linux datebằng cách viết gdate.

coreutils có sẵn với Homebrew : brew install coreutils.


1

Như câu trả lời khác đã đề cập, ngày của OS X không hỗ trợ% N (nano giây).

Bạn chỉ có thể lưu các lệnh theo thời gian như một kịch bản? Hoặc sử dụng một nhóm con hoặc nhóm lệnh cho chúng:

time (sleep 0.1; echo a; sleep 0.1)
time { sleep 0.1; echo a; sleep 0.1; }

Hoặc tổng hợp thời gian của các lệnh riêng lẻ:

$ time=$(TIMEFORMAT=%R; (time sleep 0.1; echo a) 2>&1 > /dev/null)
$ time+=+$(TIMEFORMAT=%R; (time sleep 0.1) 2>&1)
$ bc <<< $time
.206

Hoặc sử dụng một số ngôn ngữ kịch bản:

$ ruby -e 'puts "%.3f" % Time.now'
1369329611.046
$ time ruby -e '""'
0.029
$ time ruby -e 'puts "%.3f" % Time.now'
1369329622.943
0.029

%.3flà một chỉ định định dạng cho một số dấu phẩy động có 3 điểm thập phân. Time.now là một phương thức lớp của lớp Time.


Cảm ơn câu trả lời của bạn, bạn có thể vui lòng mô tả mã ruby ​​ở trên không?
pacodelumberg

1
Trong ruby -e 'puts "%.3f" % Time.now', rubygọi trình thông dịch ruby, -ethực thi đoạn script theo dòng lệnh. putslà ruby printf(loại), Timelà một vật thể bằng ruby ​​và Time.nowlà giây kể từ thời đại. Sử dụng %.3fcắt đầu ra thành 3 chữ số thập phân, là mili giây (phần ".046" và ".943" của đầu ra.)
Olie

1
Ngoài ra, timelà một công cụ dòng lệnh nhân với thời gian cần thiết để chạy lệnh theo sau. Xem man timeđể biết thêm chi tiết.
Olie

1

Glenn đã đúng, timelà lệnh bạn đang tìm kiếm, nhưng để phân tích thông tin bạn muốn, bạn sẽ cần chuyển nó cho một số bộ xử lý khác như thế nào sed.

time command-goes-here >/dev/null 2>$1|sed rules-go-here

Lệnh này sẽ loại bỏ đầu ra từ chính lệnh đó (gửi cả đầu ra tiêu chuẩn và lỗi đến / dev / null) và chuyển kết quả thời gian tới sed, trong đó bạn sẽ cần chọn các quy tắc phù hợp để chỉnh sửa luồng và đầu ra giá trị mong muốn.

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.