2010-09-21 85 views
5

có cách nào tốt đẹp của GNU để đo thời gian thực hiện trung bình (trường hợp xấu nhất, tốt nhất) của một số chương trình dòng lệnh không? Tôi có bộ lọc hình ảnh, số lượng hình ảnh không xác định, lọc chúng bằng cách sử dụng vòng lặp trong bash. Cho đến nay tôi đang sử dụng thời gian, nhưng tôi không thể tìm cách để có được một số thống kê.Thời gian thực hiện trung bình

+0

@chown Điểm của nhận xét ở trên là gì? –

+1

Câu hỏi tương tự có một số câu trả lời hay - [bash: Thời gian chạy trung bình trên một số lần chạy] (http://stackoverflow.com/questions/8215482/mean-running-time-over-a-number-of-runs/ 8216082 # 8216082). – chown

Trả lời

4

Có một chương trình Perl thú vị được gọi là dumbbench về bản chất là một trình bao bọc xung quanh lệnh time. Nó chạy chương trình của bạn một số lần, ném đi các ngoại lệ, sau đó tính toán một số số liệu thống kê.

Tác giả có một vài bài viết (herehere) phác thảo a) lý do điểm chuẩn hút và b) loại đồ thị đẹp mà bạn có thể thực hiện để làm cho số đo điểm chuẩn của bạn kém hơn một chút.

+0

Tôi chỉ hy vọng tôi có thể vượt qua các thông số khác nhau cho mỗi lần chạy, tôi sẽ kiểm tra nó tối nay. –

2

Bạn đang đi đúng hướng với time. Đó là những gì tôi sử dụng để tạo ra các phân tích thực thi mã nhỏ.

Sau đó, tôi sử dụng python để thu thập số liệu thống kê bằng cách đọc đầu ra của time. Để tăng độ chính xác, tôi thường thực hiện thử nghiệm 10 - 1000 lần, tùy thuộc vào thời gian mỗi quá trình thực hiện.

Tôi không quen với bất kỳ ứng dụng GNU được cài đặt sẵn nào thực hiện loại phân tích này.

+1

Nếu bạn định sử dụng Python, bạn có thể muốn sử dụng [timeit] (http://www.python.org/doc//current/library/timeit.html). – GreenMatt

+1

Quay lại những ngày cũ, chúng tôi chạy chương trình 12 lần bằng cách sử dụng 'thời gian', đã ném ra thời gian tốt nhất và tồi tệ nhất, sau đó tính trung bình 10 giá trị còn lại. –

+0

Tôi thích thời gian! Tôi chỉ khuyên bạn nên piping trong dữ liệu từ 'time' vì tôi không muốn có python kiểm soát việc thực hiện các lệnh của tôi và do đó có khả năng làm chậm việc thực thi bằng cách capture stdin và whatnot. Đó là loại như thế, tôi nên sử dụng C hoặc tôi nên sử dụng Python: Đó là loại cảm giác. – Sean

6

Bạn có thể gửi kết quả của thời gian để một số tập tin, và sau đó "làm việc" tập tin đó

echo "some info" >> timefile.txt 
time (./yourprog parm1 parm2) 2>> timefile.txt 
+2

Bạn không cần dấu ngoặc đơn. –

+0

Trên máy tính của tôi (phiên bản bash 4.1.5 (1) -release (x86_64-pc-linux-gnu)), không có dấu ngoặc đơn, '2 >>' áp dụng cho chương trình bên trong – pmg

+0

@DennisWilliamson Tương tự ở đây, tôi cũng * * làm ** cần parens. – chown

2
#!/bin/bash 
for i in {1..100} 
do 
    env time --append -o time_output.txt ./test_program --arguments-to-test-program 
done 
exit 

Nếu bạn thấy rằng {} 1..100 cú pháp không làm việc cho bạn thì bạn nên xem lệnh seq.

Tôi đã sử dụng env time để thực thi chương trình thời gian thay vì lệnh được tích hợp sẵn của trình bao, mà không lấy tất cả các đối số mà chương trình thời gian thực hiện. Chương trình thời gian cũng có các đối số khác để thay đổi định dạng của đầu ra của nó, mà bạn có thể sẽ muốn sử dụng để làm cho dữ liệu dễ dàng hơn để xử lý bởi một chương trình khác. Đối số -p (--portability) làm cho nó xuất ở định dạng POSIX (như thời gian dựng sẵn của BASH), nhưng sử dụng tùy chọn -f bạn có thể kiểm soát nhiều hơn. man 1 time để biết thêm thông tin.

Sau khi bạn đã thu thập dữ liệu của mình, một tập lệnh perl hoặc python đơn giản có thể dễ dàng phân tích cú pháp và phân tích dữ liệu thời gian của bạn.

+0

Bạn không phải sử dụng 'seq'. Bạn có thể làm 'for ((i = 1; i <= 100; i ++))'. –

+0

Nếu có thể, tôi muốn tránh viết phân tích riêng của mình nếu người khác làm. –

0

Bạn nên cân nhắc có nên bỏ thời gian vòng lặp bên ngoài và chia cho các lần lặp lại thay vì định thời gian mỗi lần lặp lại riêng biệt hay không. Nếu bạn lo lắng về việc loại bỏ cao và thấp, chỉ cần thực hiện thêm một vài lần lặp lại để tiêu diệt chúng.

time for i in {1..1000} 
do 
    something 
done 

Bạn có thể capture the output from time in a variable:

foo=$({ time { 
    echo "stdout test message demo" 
    for i in {1..30} 
    do 
     something 
    done 
    echo "stderr test message demo" >&2 
} 1>&3 2>&4; } 2>&1) 

và làm một số giả toán:

foo=${foo/.}   # "divide" by ... 
echo "0.00${foo/#0}" # ... 1000 

Hoặc chỉ cần sử dụng bc:

echo "scale=8; $foo/1000" | bc 
Các vấn đề liên quan