2013-08-11 43 views
6

Tôi mới dùng Ruby profiling, và có vẻ như ruby-prof là một lựa chọn phổ biến. Tôi chỉ cần cài đặt các đá quý và gọi chương trình của tôi:Làm thế nào để tôi nhận được ruby-prof để bỏ qua các phương thức gem/standard library/gem của Ruby?

ruby-prof ./my-prog.rb 

Tuy nhiên, sản lượng là cực kỳ dài dòng, bởi vì dữ liệu hồ sơ cho tất cả Ruby lõi và phương pháp thư viện chuẩn, và đá quý khác được bao gồm. Ví dụ, ba dòng đầu là:

8.79  0.011  0.010  0.000  0.001  3343 *String#% 
7.28  0.078  0.009  0.000  0.069  2068 *Array#each 
4.93  0.038  0.006  0.000  0.032  1098 *Array#map 

Đó không phải là thông tin từ xa hữu ích cho tôi, vì tôi đã biết rằng giao dịch chương trình của tôi với Strings và Mảng rất nhiều, và có lẽ những lớp học đã có địa ngục tối ưu hóa ra của họ. Tôi chỉ quan tâm đến các điểm nóng trong số mã số của tôi.

Tôi đã thử một số chế độ máy in khác, ví dụ: -p graph_html-p call_stack, nhưng tất cả đều có cùng một vấn đề.

Tôi thấy rằng ruby-prof hỗ trợ một số loại bỏ phương pháp và đơn giản hóa:

-x, --exclude regexp    exclude methods by regexp (see method elimination) 
-X, --exclude-file file   exclude methods by regexp listed in file (see method elimination) 
    --exclude-common-cycles  make common iterators like Integer#times appear inlined 
    --exclude-common-callbacks make common callbacks invocations like Integer#times appear 

nhưng dường như không có bất kỳ cách rõ ràng để có được những gì tôi thực sự muốn, mà là dữ liệu hồ sơ cho mã của tôi chỉ , tức là với thời gian trôi qua bên trong mã từ lõi Ruby/stdlib, và các đá quý khác chỉ được tính là thời gian trôi qua bên trong mã của tôi.

Khi tôi có thể thấy mã của mình có phương thức foo là nút cổ chai hiệu suất do được gọi là hàng nghìn lần và không hoạt động tốt, thì chỉ tôi muốn xem phân tích thời gian trôi qua giữa mã của tôi và mã lõi/thư viện được gọi trong phương thức cụ thể đó.

Tôi không thể hiểu tại sao đây không phải là tính năng chuẩn, vì tôi hy vọng rằng đó là những gì mọi người muốn làm: trước tiên hãy lập hồ sơ cho mã của riêng bạn và sau đó bạn đã hết hàng để tối ưu hóa, có khả năng bắt đầu tối ưu hóa các đá quý bạn sử dụng và thậm chí có thể là lõi/stdlib của Ruby. Tôi đang thiếu gì?

Trả lời

0

Bạn có thể muốn lập hồ sơ và điểm chuẩn thông qua các bài kiểm tra. Minitest cho phép điều này trong khuôn khổ thử nghiệm của họ. Bằng cách đó bạn có thể tập trung vào các hành vi cụ thể để có được thời gian của bạn.

Có sẵn trong Ruby 2.0 hoặc làm Gem cho Ruby 1.9 trở xuống.

Theo như cách lược tả theo cùng một cách, require 'profile' và sử dụng nó cho các thử nghiệm tương tự.

Điều này blog post chi tiết cách thực hiện việc này, tôi không tin rằng nó đã thay đổi rất nhiều.

+0

Cảm ơn câu trả lời, nhưng bộ thử nghiệm của tôi đã được viết bằng RSpec.Tôi sẽ cung cấp cho 'hồ sơ' một đi nhưng blog đó dường như cho thấy nó bị chính xác cùng một vấn đề của các phương pháp thư viện gây ô nhiễm kết quả. –

+0

Vâng, nó chắc chắn không phải là một kết hợp chính xác cho một câu trả lời, nhưng có thể giúp bạn gần hơn. Và như xa như sử dụng RSpec, nhìn thấy cách họ đã làm nó trong minitest có thể cung cấp cho bạn một số manh mối. RSpec chỉ là Ruby, mở nó ra và sửa đổi nó ... và có thể gửi một tính năng! – vgoff

2

Tôi đồng ý đây là vấn đề lớn với ruby-prof. Tôi đã có xu hướng thích perftools.rb. Nó tích hợp với gperftools và nó hỗ trợ khác nhau focus and ignore options, cùng với các báo cáo đồ họa vượt trội để hiểu nhanh hotspots and their call trees.

Với tính năng ruby-prof, bạn cũng có thể thử xuất ra định dạng KCacheGrind và sử dụng KCacheGrind Viewer để phân tích. Nó có một số chế độ trực quan hóa và tạo điều kiện cho việc lọc quảng cáo và khám phá kết quả.