2012-10-23 21 views
5

Tôi đang lược tả mã của mình và tôi đã tìm thấy phần đắt nhất của nó. Tuy nhiên nó xảy ra trong một hàm nội tuyến. Để đo lường tác động tôi đã buộc chức năng không được gạch chân.Callgrind inlined functions

Bây giờ tôi muốn báo cáo dữ liệu lược tả chính xác. Nếu không có nội tuyến chúng ta có một chi phí lớn (chức năng về cơ bản là một vòng lặp đơn, nhưng nó được gọi là rất, rất thường xuyên).

Tôi tự hỏi liệu có thể hướng dẫn valgrind xử lý một phần cụ thể của mã vì nó là một hàm của chính nó hay không (chẳng hạn như makros CALLGRIND_START_INSTRUMENTATION, CALLGRIND_STOP_INSTRUMENTATION) mà không buộc hàm không được gạch chân.

Trả lời

5
valgrind --tool=callgrind 

có thể hiển thị nhiều chi tiết về vị trí của CPU (và các chi phí khác như làm bộ nhớ cache). kcachegrind (công cụ trực quan) có thể dễ dàng hiển thị các chi phí khác nhau (bao gồm các chức năng nội tuyến).

Cố gắng chạy ví dụ: với:

valgrind --tool=callgrind --dump-instr=yes --collect-jumps=yes 

Lưu ý: để tìm kiếm chi phí ở mức độ hướng dẫn, bạn phải sử dụng kcachegrind

+0

Thực tế nó hoạt động rất tốt. kcachegrind là một công cụ rất hay! – ypnos

-1

Im không chắc chắn nếu điều này là những gì bạn muốn nhưng Im không chắc chắn nó không phải là :):
http://valgrind.org/docs/manual/cg-manual.html#cg-manual.overview

Ngoài ra, kể từ khi một hướng dẫn bộ nhớ cache đọc được thực hiện theo hướng dẫn thực hiện, bạn có thể tìm thấy có bao nhiêu hướng dẫn được thực hiện trên mỗi dòng , có thể hữu ích cho việc lược tả truyền thống.

+0

Vâng, tôi đọc dòng đó, tuy nhiên tôi không thể tìm thấy làm thế nào để làm điều gì vượt quá hàm phạm vi granularity. – ypnos

0

Có thể bạn có thể gọi macro CALLGRIND_TOGGLE_COLLECT ngay trước khi gọi hàm của bạn và ở đầu hàm, ditto để thoát khỏi hàm của bạn và ngay sau cuộc gọi hàm của bạn. Ví dụ:

int main() 
{ 
    CALLGRIND_TOGGLE_COLLECT; 
    myFunction(); 
    CALLGRIND_TOGGLE_COLLECT; 
} 

__attribute__((noinline)) 
void myFunction() 
{ 
    CALLGRIND_TOGGLE_COLLECT; 
    //Do stuff 
    CALLGRIND_TOGGLE_COLLECT; 
} 

Nên thực hiện thủ thuật.

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