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
và -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ì?
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ả. –
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