2011-12-21 31 views
5

Tôi muốn biết lượng thời gian thực hiện cho một chương trình dưới linux tính bằng micro giây (hoặc độ chính xác cao hơn). Hiện tại tôi đang sử dụng lệnh time, nhưng nó mang lại cho tôi độ chính xác tối đa mili giây. Có cách nào để tinh chỉnh lệnh time để cung cấp cho độ chính xác tốt hơn hoặc là có một số lệnh khác cho cùng?lệnh thời gian linux micro giây hoặc độ chính xác tốt hơn

Trả lời

8

Câu hỏi của bạn là vô nghĩa: bạn sẽ không nhận được các phép đo lặp lại ngay cả trong thời gian mili giây không báo cáo.

Thêm nhiều chữ số hơn sẽ chỉ thêm tiếng ồn. Bạn cũng có thể kéo các chữ số bổ sung từ /dev/random.

+0

Tôi không hiểu ý của bạn. Tôi nói rằng tôi muốn độ chính xác tốt hơn mili giây không phải là không thể đối với các bộ vi xử lý ngày nay, nơi chúng tôi thậm chí có thể nhận được độ chính xác tối đa nano giây. Làm thế nào để thêm nhiều chữ số thêm tiếng ồn nhiều hơn? –

+5

@Guidance Vì mã chạy trên hệ điều hành không thời gian thực không có thực thi xác định. Tất cả những gì cần thiết là hệ điều hành xử lý một số gói IP, hoặc một quá trình khác để chạy, hoặc croaking thức dậy để kiểm tra xem nó có nên làm điều gì đó không, hoặc hệ thống tập tin quyết định nó sẽ ghi ra các trang bẩn, vv. Thời gian bị đình chỉ cho một số thời gian (số lượng nhỏ) và thời gian tắt. Thời gian tích hợp của hệ điều hành, chẳng hạn như thời gian CPU (ngược với thời gian đồng hồ treo tường), cũng thường được tính theo thời gian có độ phân giải nhất định (thường là 1 hạt nhân, 1 milisecond hoặc hơn) – nos

+0

Kiểm tra nhanh với 'thời gian/bin/sleep 0,006' dường như chỉ ra rằng tiếng ồn nhỏ hơn 1 mili giây. Vì vậy, trong khi các phép đo như vậy chắc chắn nguy hiểm, yêu cầu của Guanidene không phải là vô nghĩa. –

0

Xem liệu current_kernel_time() có hữu ích cho bạn trong yêu cầu của bạn hay không. Tôi đã sử dụng nó và thấy hữu ích vì nó cung cấp độ chi tiết cho cấp nano giây. Chi tiết khác là here.

4

Tôi đồng ý với Employed Russian's answer. Nó không có ý nghĩa nhiều để muốn độ chính xác micro giây cho các biện pháp như vậy. Vì vậy, bất kỳ chữ số bổ sung nào bạn có là vô nghĩa (và về cơ bản là ngẫu nhiên).

Nếu bạn có mã nguồn của ứng dụng để đo lường, bạn có thể sử dụng các hàm clock hoặc clock_gettime, nhưng đừng hy vọng tốt hơn một chục micro giây chính xác. Ngoài ra còn có hướng dẫn máy RDTSC.

Đọc số linux clock howto. Và đừng quên rằng thời gian thực hiện, là từ một quan điểm ứng dụng, không xác định và không tái sản xuất (suy nghĩ về chuyển mạch bối cảnh, nhớ cache, ngắt, vv ... diễn ra vào thời điểm ngẫu nhiên)..

Nếu bạn muốn đo hiệu suất của toàn bộ chương trình, hãy chạy chương trình trong ít nhất vài giây và đo thời gian (ví dụ 8 lần) và lấy mức trung bình (có lẽ là giảm thời gian xấu nhất &).

Nếu bạn muốn đo thời gian cho các chức năng đặc biệt, học cách profile ứng dụng của bạn (gprof, oprofile etc etc ...) Xem thêm this question

Đừng quên đọc time(7)

Be lưu ý rằng trên máy tính xách tay hiện tại (máy tính xách tay, máy tính để bàn, máy chủ) out-of-orderpipelinedsuperscalar với phức tạp CPU cachesTLBbranch predictors, thời gian thực hiện của một số vòng lặp nhỏ hoặc trình tự máy s không thể tái sản xuất (số nano giây sẽ thay đổi từ lần chạy này sang lần chạy tiếp theo). Và hệ điều hành này cũng bổ sung thêm tính ngẫu nhiên (scheduling, context switches, interrupts, page cache, copy-on-write, demand-paging ...) nên không có ý nghĩa gì để đo lường việc thực hiện một số lệnh với hơn một phần nghìn giây hoặc có thể 100µs nếu bạn may mắn- về độ chính xác. Bạn nên điểm chuẩn lệnh của bạn nhiều lần.

Để có các biện pháp đáng kể, bạn nên thay đổi ứng dụng được chuẩn hóa để chạy trong vài giây (có thể thêm một số vòng lặp trong main hoặc chạy với tập dữ liệu lớn hơn ...) và lặp lại lệnh được chuẩn lần. Điều đó có nghĩa là (hoặc tệ nhất, hoặc tốt nhất, tùy thuộc vào những gì bạn đang làm sau) của các biện pháp.

Nếu hệ thống time(1) là không đủ, bạn có thể tạo cơ sở đo lường của riêng mình; xem thêm getrusage(2); Tôi hoài nghi về việc bạn có được các biện pháp chính xác hơn.

BTW trên tôi i3770K GNU gần đây/Linux (4.2 kernel, Debian/Sid/x86-64) máy tính để bàn, "hệ thống" -calls như time(2) hoặc clock_gettime(2) chạy trong khoảng 3 hoặc 4 nano giây (nhờ vdso(7) mà tránh gánh nặng của một số thực syscall ...) để bạn có thể sử dụng chúng bên trong chương trình của bạn khá thường xuyên.

2

Sử dụng gettimeofday - cho độ chính xác micro giây

Các vấn đề liên quan