2012-12-03 18 views
14

Tôi đang cố gắng để hồ sơ (với Callgrind) một phần cụ thể của mã của tôi bằng cách loại bỏ tiếng ồn và tính toán mà tôi không quan tâm. Dưới đây là một ví dụ về những gì tôi muốn làm:Callgrind: Hồ sơ một phần cụ thể của mã của tôi

for (int i=0; i<maxSample; ++i) { 
    //Prepare data to be processed... 
    //Method to be profiled with these data 
    //Post operation on the data 
} 

use-case của tôi là một thử nghiệm hồi quy, tôi muốn chắc chắn rằng phương pháp trong câu hỏi là vẫn đủ nhanh (cái gì đó như thêm ít hơn 10% hướng dẫn kể từ lần triển khai cuối cùng). Đây là lý do tại sao tôi muốn có mẫu đầu ra sạch hơn Callgrind. (Tôi cần vòng lặp for để có một lượng dữ liệu đáng kể được xử lý để có ước tính tốt về hành vi của phương pháp tôi muốn gửi hồ sơ)

Lần thử đầu tiên của tôi là thay đổi mã thành:

for (int i=0; i<maxSample; ++i) { 
    //Prepare data to be processed... 
    CALLGRIND_START_INSTRUMENTATION; 
    //Method to be profiled with these data 
    CALLGRIND_STOP_INSTRUMENTATION; 
    //Post operation on the data 
} 
CALLGRIND_DUMP_STATS; 

Thêm macro Callgrind để điều khiển thiết bị. Tôi cũng đã thêm --instr-atstart = không có tùy chọn để đảm bảo rằng tôi chỉ cấu hình một phần của mã mà tôi muốn ...

Thật không may với cấu hình này khi tôi bắt đầu khởi chạy thực thi của mình bằng callgrind, nó không bao giờ kết thúc ... Nó không phải là một câu hỏi về sự chậm chạp, bởi vì một thiết bị đo đạc đầy đủ kéo dài chưa đầy một phút.

Tôi cũng đã cố gắng

for (int i=0; i<maxSample; ++i) { 
    //Prepare data to be processed... 
    CALLGRIND_TOGGLE_COLLECT; 
    //Method to be profiled with these data 
    CALLGRIND_TOGGLE_COLLECT; 
    //Post operation on the data 
} 
CALLGRIND_DUMP_STATS; 

(hoặc --toggle-thu thập = tùy chọn "myMethod") Nhưng callgrind trở cho tôi một bản ghi mà không cần bất kỳ cuộc gọi (KCachegrind là màu trắng như tuyết :(và nói không hướng dẫn ...)

tôi đã sử dụng các macro/tùy chọn một cách chính xác? Bất kỳ ý tưởng về những gì tôi cần phải thay đổi để có được kết quả mong đợi?

Trả lời

12

Cuối cùng tôi quản lý để giải quyết vấn đề này ... Đây là một sự cố cấu hình:

Tôi giữ mã

for (int i=0; i<maxSample; ++i) { 
    //Prepare data to be processed... 
    CALLGRIND_TOGGLE_COLLECT; 
    //Method to be profiled with these data 
    CALLGRIND_TOGGLE_COLLECT; 
    //Post operation on the data 
} 
CALLGRIND_DUMP_STATS; 

Nhưng chạy callgrind với --collect-atstart = no (và không có --instr-atstart = no !!!) và nó làm việc một cách hoàn hảo, trong một thời gian hợp lý (~ 1 phút).

Vấn đề với thiết bị START/STOP là callgrind đổ một tệp (callgrind.out. # Number) vào mỗi lần lặp (mỗi STOP) do đó nó thực sự rất chậm ... (sau 5 phút tôi chỉ có 5000 lần chạy cho 300 000 điểm chuẩn lặp lại ... không phù hợp cho phép thử hồi quy).

+0

để bạn không khởi động/dừng thiết bị? – Paschalis

+1

@Paschalis bắt đầu/dừng sẽ tạo ra bãi chứa mới mỗi khi bạn gọi dừng lại. Nếu bạn muốn có được tập hợp trong một báo cáo duy nhất, chuyển đổi có vẻ là con đường để đi (về cơ bản nó chỉ flips hoạt động/không hoạt động thiết bị). – joetde

+0

cảm ơn vì phản hồi @joetde. Tôi hỏi vì tôi đang phải đối mặt với một vấn đề mà callbacks/macro từ callgrind hoặc bất kỳ công cụ nào khác dường như không bao giờ được gọi. Thêm [tại đây] (http://goo.gl/08OM3c)! – Paschalis

0

Tùy chọn chuyển đổi thu thập rất cầu kỳ về cách bạn chỉ định phương thức sử dụng làm trình kích hoạt. Bạn thực sự cần phải xác định danh sách đối số của nó là tốt, và thậm chí cả khoảng trống cần phải khớp! Sử dụng tên phương thức chính xác như nó xuất hiện trong đầu ra callgrind. Ví dụ, tôi đang sử dụng invokation này:

$ valgrind 
    --tool=callgrind 
    --collect-atstart=no 
    "--toggle-collect=ctrl_simulate(float, int)" 
    ./swaag 

Hãy quan sát:

  • Các dấu ngoặc kép xung quanh lựa chọn.
  • Danh sách đối số bao gồm cả dấu ngoặc đơn.
  • Khoảng trắng sau ký tự dấu phẩy.
Các vấn đề liên quan