2008-09-16 30 views
7

Không có gì lạ khi tôi có một chương trình có hiệu năng phụ thuộc rất nhiều vào một vài chức năng và tôi muốn có thể đo tốc độ vòng lặp hoặc đoạn mã đơn xuống độ chính xác từng đồng hồ để tôi biết liệu các thay đổi của tôi có thực sự cải thiện hay không hiệu suất hoặc cho dù tôi chỉ rơi vào giả dược của mã "tối ưu hóa".Công cụ lược tả cấp thấp yêu thích của bạn là gì?

Cá nhân tôi tìm thấy chính mình bằng cách sử dụng ffmpeg's "bench.h", một tập hợp các macro C sử dụng rdtsc để đo thời gian đồng hồ và tự động bù cho các công tắc ngữ cảnh và tương tự. Tất nhiên, cách tiếp cận này có những điểm yếu riêng của nó; phương pháp lược tả cấp thấp nào khác mà người dùng StackOverflow thích?

Trả lời

2

Tôi hiện không lập trình cấp thấp, nhưng nếu tôi đã làm, tôi chắc chắn sẽ xem xét dtrace; từ những gì tôi đã đọc nó trông cực kỳ thú vị. Đối với người dùng OS X, cũng có shark.

0

valgrind là công cụ lựa chọn của tôi trên các hệ thống dựa trên Unix.

0

Vấn đề chính là khi bạn biên dịch 'điểm chuẩn của mình, bạn có khả năng sửa đổi kết quả của mình (tùy thuộc vào cách thức và thời điểm triển khai). Và với những thứ cấp thấp đó, bạn có thể bị ảnh hưởng bởi sự tối ưu hóa của trình biên dịch.

Nhưng cá nhân trên Linux, tôi có điểm mềm cho oprofile (oprofile) đây là một profiler rộng được nhúng dưới dạng mô-đun hạt nhân và theo dõi định kỳ nơi ứng dụng của bạn dành thời gian. Vì vậy, điều này cấu hình toàn bộ hệ thống của bạn, không chỉ một ứng dụng. Nhưng nó có thể là nó không cho bạn đủ chi tiết.

0

Tôi khuyên bạn không nên chỉnh sửa mã của mình để cấu hình. Câu trả lời hay nhất tôi có thể đưa ra là sử dụng PTU (Tiện ích hiệu chỉnh hoạt động) của Intel, có thể tìm thấy ở đây:

Tiện ích này là hậu duệ trực tiếp của VTune và cung cấp trình lấy mẫu có sẵn tốt nhất. Bạn sẽ có thể theo dõi vị trí mà CPU đang sử dụng hoặc lãng phí thời gian (với sự trợ giúp của các sự kiện phần cứng có sẵn), và điều này không làm chậm ứng dụng hoặc sự xáo trộn của cấu hình.

1

valgrind đã được đề cập, nhưng nó đặc biệt hữu ích với công cụ callgrind:

$ valgrind --tool=callgrind your_program 

Sau đó, bạn có thể sử dụng KCacheGrind để hình dung dữ liệu.

0

Đối với Linux: Google Perftools

  • Nhanh hơn valgrind (chưa, không quá tốt grained)
  • Không cần mã số nhạc cụ
  • sản lượng đồ họa đẹp (-> kcachegrind)
  • Liệu bộ nhớ-profiling, cpu-profiling, kiểm tra rò rỉ
0

OK, bạn đang mô tả một hot tình trạng-điểm - một vòng lặp chặt chẽ chiếm một phần lớn thời gian và không chứa các cuộc gọi hàm.

Bạn muốn biết liệu những thay đổi bạn thực hiện có ảnh hưởng gì không.

Dưới đây là những gì tôi sẽ làm gì:

  • Để xem những gì thay đổi để làm cho nó nhanh hơn, hai phương pháp, xương đơn giản:

1) Độc bước qua vòng lặp bên trong , để xem chính xác những gì nó đang làm và tại sao. Rất có thể tôi sẽ thấy một số điều có thể được thực hiện tốt hơn.

và/hoặc

2) Làm cho nó chạy trong vòng ngoài lớn và sau đó ngắt thủ công. Làm điều này nhiều lần. Các hướng dẫn/báo cáo chiếm nhiều thời gian nhất sẽ xuất hiện trong các mẫu đó tương ứng với chi phí của chúng.

  • Để nói nếu tôi đã thực hiện bất kỳ sự khác biệt, một kỹ thuật xương đơn giản:

Run nó một tỷ lần trong một vòng lặp bên ngoài và đếm giây. Điều đó cho biết có bao nhiêu nano giây mà vòng lặp bên trong mất.

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