2009-11-25 29 views
27

Mọi người luôn nói để lập hồ sơ chương trình của bạn trước khi thực hiện tối ưu hóa nhưng không ai từng mô tả cách thực hiện.Khuyến nghị cho C Profilers?

Thực tiễn của bạn để lược tả mã C là gì?

+2

Trình biên dịch và hệ điều hành nào bạn đang sử dụng? – LnxPrgr3

Trả lời

21

Sử dụng gcc, tôi biên dịch và liên kết với -pg (như đã giải thích ví dụ here), sau đó tiếp tục bằng cách chạy chương trình (theo nguyên tắc cũng đề nghị tại URL đó) và sử dụng gprof. Các công cụ sẽ thay đổi nếu bạn đang sử dụng các trình biên dịch khác nhau & c, nhưng URL vẫn được đề xuất, ngay cả khi đó, cho các phần về ý tưởng chung về cách thức và lý do để lập cấu hình mã của bạn.

+1

Điều quan trọng là chạy ứng dụng của bạn theo trình lược tả theo cách vừa là đại diện cho cách ứng dụng được sử dụng bình thường và có thể lặp lại. Một bộ các trường hợp thử nghiệm cụ thể sẽ giúp bạn. – caf

12

Nếu bạn đang sử dụng Linux, thì tôi khuyên bạn nên kết hợp ValGrindCallGrind and KCacheGrind. ValGrind là một phương pháp tuyệt vời cho việc tìm kiếm rò rỉ bộ nhớ, và phần mở rộng CallGrind làm cho một profiler tốt.

LƯU Ý: Tôi chỉ learned rằng valgrind bây giờ cũng hoạt động trên Mac OSX. Tuy nhiên, CallGrind và KCacheGrind chưa được cập nhật từ năm 2005. Bạn có thể muốn xem other front-ends.

1

Cá mập/dụng cụ (sử dụng dtrace) là các trình đào tạo có sẵn trên máy Mac. Chúng khá tốt.

+1

Tôi đặc biệt thích Shark. Rất hữu ích (và miễn phí!). – justin

3

Glad You hỏi :-) Nếu bạn không nhớ trái ngược, kiểm tra các câu trả lời:

Lết tôi cố gắng đặt nó trong một nutshell:

  1. Chương trình có chờ bạn, hoặc bạn có chờ đợi không? Nếu nó không làm bạn chờ đợi, thì bạn không có vấn đề gì, vì vậy hãy để nó một mình.

  2. Nếu nó làm bạn đợi, hãy tiếp tục.

Tôi khuyên bạn nên lấy mẫu, chụp X-quang hoạt động của chương trình đang hoạt động khi bận (không đợi bạn). Lấy mẫu ít nhất của ngăn xếp cuộc gọi, không chỉ là bộ đếm chương trình. Nếu bạn chỉ nhận được mẫu của bộ đếm chương trình, nó sẽ vô nghĩa nếu chương trình của bạn dành thời gian đáng kể trong I/O hoặc trong các thói quen thư viện, do đó, không giải quyết cho điều đó.

Nếu bạn muốn nhận được nhiều mẫu, bạn cần một hồ sơ. Nếu bạn chỉ cần một vài, nút tạm dừng trong trình gỡ lỗi hoạt động tốt. Theo kinh nghiệm của tôi, 20 là quá đủ và 5 thường là đủ.

Tại sao? Giả sử bạn có 1000 mẫu của ngăn xếp cuộc gọi.Mỗi mẫu đại diện cho một mảnh thời gian đồng hồ treo tường đang được chi tiêu chỉ vì mỗi dòng mã trên ngăn xếp yêu cầu nó. Vì vậy, nếu có một dòng mã xuất hiện trên 557 mẫu trong số 1000 mẫu, bạn có thể giả định nó chịu trách nhiệm 557/1000 thời gian, cho hoặc lấy một vài mẫu (15). Điều đó có nghĩa là, nếu toàn bộ thời gian thực hiện đã khiến bạn mất 100 đô la, thì chi phí đó sẽ là 55,70 đô la, cung cấp hoặc mất 1,50 đô la **, vì vậy bạn nên xem liệu bạn có thực sự cần nó hay không.

Nhưng bạn có cần 1000 mẫu không? Nếu dòng đó có giá khoảng 55,7% thời gian, thì nếu bạn chỉ lấy 10 mẫu, bạn sẽ thấy nó trên 6 mẫu, tặng hoặc lấy 1,5 mẫu. Vì vậy, nếu bạn nhìn thấy một tuyên bố trên 6 trong số 10 mẫu, bạn biết đó là chi phí cho bạn khoảng giữa $ 45 và $ 75 trong số đó $ 100. Ngay cả khi nó chỉ tốn ít nhất là 45 đô la, bạn có muốn xem liệu bạn có thực sự cần nó không?

Đó là lý do tại sao bạn không cần nhiều mẫu - bạn không cần nhiều chính xác. Những gì bạn cần là những gì các mẫu ngăn xếp cung cấp cho bạn - chúng chỉ cho bạn chính xác những dòng có giá trị nhất để tối ưu hóa.

** Độ lệch chuẩn của số lượng mẫu là sqrt(f * (1-f) * nsamp) trong đó f là phần mẫu chứa dòng.

+0

Cảm ơn bạn rất nhiều vì bài viết rất sâu sắc này! Có cách nào để có được lldb để làm các loại ngẫu nhiên tạm dừng này đòi hỏi? –

+0

@Koz: Tôi không biết Ildb. Tôi chỉ sử dụng bất kỳ trình gỡ lỗi nào có khả năng Ctrl-Break. –

1

Để hoàn thành, tôi sẽ thêm oprofile. Nó đặc biệt thú vị nếu bạn muốn chuẩn hạt nhân.

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