Dưới đây là làm thế nào để sử dụng eprof, nhiều khả năng là giải pháp đơn giản nhất dành cho bạn:
Trước tiên, bạn cần phải bắt đầu nó, giống như hầu hết các ứng dụng trên mạng:
23> eprof:start().
{ok,<0.95.0>}
Eprof hỗ trợ hai chế độ profiling. Bạn có thể gọi nó và yêu cầu để hồ sơ một chức năng nhất định, nhưng chúng tôi không thể sử dụng đó bởi vì các quá trình khác sẽ mess tất cả mọi thứ lên. Chúng ta cần phải tự khởi động nó profiling và cho nó biết khi nào dừng lại (đây là lý do tại sao bạn sẽ không có một kịch bản dễ dàng, bằng cách này).
24> eprof:start_profiling([self()]).
profiling
Điều này cho eprof biết mọi thứ sẽ được chạy và sinh ra từ trình bao. Các quy trình mới sẽ được đưa vào đây. Tôi sẽ chạy một số chức năng đa xử lý tùy tiện tôi có, mà spawns khoảng 4 quá trình giao tiếp với nhau trong vài giây:
25> trade_calls:main_ab().
Spawned Carl: <0.99.0>
Spawned Jim: <0.101.0>
<0.100.0>
Jim: asking user <0.99.0> for a trade
Carl: <0.101.0> asked for a trade negotiation
Carl: accepting negotiation
Jim: starting negotiation
... <snip> ...
Bây giờ chúng ta có thể nói eprof ngừng profiling một khi chức năng được thực hiện chạy.
26> eprof:stop_profiling().
profiling_stopped
Và chúng tôi muốn có nhật ký. Eprof sẽ in chúng vào màn hình theo mặc định. Bạn có thể yêu cầu nó cũng đăng nhập vào một tập tin với eprof:log(File)
. Sau đó, bạn có thể nói nó để phân tích kết quả. Chúng tôi nói với nó sụp đổ thời gian chạy từ tất cả các quá trình vào một bảng duy nhất với các tùy chọn total
(xem manual cho các tùy chọn nhiều hơn):
27> eprof:analyze(total).
FUNCTION CALLS % TIME [uS/CALLS]
-------- ----- --- ---- [----------]
io:o_request/3 46 0.00 0 [ 0.00]
io:columns/0 2 0.00 0 [ 0.00]
io:columns/1 2 0.00 0 [ 0.00]
io:format/1 4 0.00 0 [ 0.00]
io:format/2 46 0.00 0 [ 0.00]
io:request/2 48 0.00 0 [ 0.00]
...
erlang:atom_to_list/1 5 0.00 0 [ 0.00]
io:format/3 46 16.67 1000 [ 21.74]
erl_eval:bindings/1 4 16.67 1000 [ 250.00]
dict:store_bkt_val/3 400 16.67 1000 [ 2.50]
dict:store/3 114 50.00 3000 [ 26.32]
Và bạn có thể thấy rằng phần lớn thời gian (50%) được chi trong dict: store/3. 16,67% được đưa ra trong kết quả xuất ra, 16,67% khác được thực hiện bởi erl_eval (đây là lý do tại sao bạn nhận được bằng cách chạy các hàm ngắn trong trình bao - phân tích cú pháp chúng trở nên dài hơn chạy chúng).
Sau đó, bạn có thể bắt đầu đi từ đó. Đó là những điều cơ bản về thời gian chạy hồ sơ với Erlang. Xử lý cẩn thận, eprof có thể khá tải trên hệ thống sản xuất hoặc cho các chức năng chạy quá lâu. Đặc biệt là trên một hệ thống sản xuất.
Có một vài ungivens: Là một này hệ thống sản xuất? 'eprof' và * đặc biệt là *' fprof' phát sinh hiệu suất khi chạy. Cả hai đều có thể làm theo những người mới sản xuất. Bạn có thể muốn đo lường điều gì đó khác như các chuyến đi khứ hồi trên mạng và vân vân! Cách dễ nhất có lẽ là tiêm một cuộc gọi 'timer: tc' xung quanh hàm cần đo. Ngoài ra, lấy 'erlang: now()' và chuyển nó sang một quy trình khác để có thể thực hiện công việc đo lường. –
bạn đã có tập lệnh eprof của bạn (hoặc walkthrough) thấp hơn trên trang :) –