2015-07-16 26 views
5

Tôi đang sử dụng perf để có được ý tưởng về phí trên mỗi chức năng của chương trình của tôi áp đặt trên tổng thời gian thực hiện. Đối với điều đó, tôi sử dụng sự kiện cpu-cycle:Perf hoạt động như thế nào?

perf record -e cpu-cycles -c 10000 <binary-with-arguments> 

Khi tôi xem kết quả, tôi thấy một số tỷ lệ phần trăm được liên kết với từng chức năng. Nhưng điều không hợp lý với tôi là một trường hợp như thế này: hàm A được gọi trong hàm B và không ở đâu khác. Nhưng tỷ lệ phần trăm trên đầu tôi nhận được cho hàm A cao hơn B. Nếu B gọi A, điều đó có nghĩa B phải bao gồm chi phí của A. Hay tôi đang thiếu thứ gì đó ở đây?

Trả lời

5

Lệnh perf bạn đang sử dụng chỉ lấy mẫu chương trình của bạn mà không cần ghi lại bất kỳ thông tin nào của ngăn xếp cuộc gọi. Sử dụng perf report bạn nhận được số lượng mẫu rơi vào các chức năng của bạn độc lập với các mối quan hệ gọi điện của chúng.

Bạn có thể sử dụng tùy chọn --call-graph để có được một cây khi sử dụng perf report:

perf record -e cpu-cycles --call-graph dwarf -c 10000 <binary-with-arguments> 
1

Perf hoạt động trên mô hình Thanh ghi cụ thể của CPU của bạn cho phép đo như chu kỳ hoặc chi nhánh-bỏ lỡ hoặc lâu hơn. Một phần đặc biệt được gọi là PMU (Đơn vị đo lường hiệu suất) đang đếm tất cả các loại sự kiện.

Vì vậy, nếu bạn chỉ đo một vài tính năng của chương trình, thực sự không có phí, vì PMU của CPU hoạt động độc lập với tính toán thực tế.

Nếu bạn vượt quá số lượng đăng ký PMU của bạn, chu kỳ đo lường thông qua các tính năng cần đo. Perf chú thích điều này với [XX%].

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