2010-12-01 39 views
12

Tôi quan tâm đến việc đánh giá các phần khác nhau của chương trình của tôi về tốc độ. Tôi đã thử sử dụng thông tin (thống kê) và erlang: now()ERLANG - Ứng dụng thời gian

Tôi cần biết xuống đến micro giây tốc độ trung bình là bao nhiêu. Tôi không biết tại sao tôi gặp rắc rối với một kịch bản tôi đã viết.

Nó sẽ có thể bắt đầu ở mọi nơi và kết thúc ở mọi nơi. Tôi gặp phải vấn đề khi tôi cố gắng bắt đầu nó trên một quá trình có thể chạy đến 4 lần song song.

Có ai đã có giải pháp cho vấn đề này không?

CHỈNH SỬA:

Sẵn sàng trả tiền nếu ai đó có thể cung cấp tập lệnh để thực hiện. NÓ CẦN LÀM SPAWN mặc dù nhiều quá trình '. Tôi không thể chấp nhận một chức năng như hẹn giờ .. ít nhất là trong việc thực hiện tôi đã thấy. CNTT chỉ đi qua một quá trình và thậm chí sau đó một số chỉnh sửa lớn là cần thiết cho một thử nghiệm đầy đủ của một chương trình đầy đủ. Hy vọng tôi đã làm cho nó đủ rõ ràng.

+0

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. –

+0

bạn đã có tập lệnh eprof của bạn (hoặc walkthrough) thấp hơn trên trang :) –

Trả lời

38

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.

+0

Người đàn ông làm việc tốt, thử nó ra, trông đẹp .. Một câu hỏi: Tại sao một số quá trình 'nói 0 cuộc gọi trong prog của tôi? Tôi biết nó phải được gọi để có một số trò vui khác như danh sách: flatten được gọi. Đây có phải là điều gì đó hiển nhiên không? Hoặc một chút bí truyền hơn cho prog của tôi. – BAR

+0

Tôi không thể nói mà không có mã - Tôi không nhớ đã thấy mã đó trong mã của riêng tôi. –

3

Cách thông thường để thực hiện việc này là hẹn giờ: tc. Here là một lời giải thích tốt.

+0

Tôi cần nó chạy trên toàn bộ quá trình 'không chỉ là thử nghiệm một. – BAR

+1

'eprof' là công cụ bạn muốn. –

0

tôi có thể khuyên bạn nên công cụ này: https://github.com/virtan/eep

Bạn sẽ nhận được một cái gì đó giống như https://raw.github.com/virtan/eep/master/doc/sshot1.png này như một kết quả.

Từng hướng dẫn bước cho profiling tất cả các quá trình trên hệ thống chạy:

Trên hệ thống mục tiêu:

1> eep:start_file_tracing("file_name"), timer:sleep(20000), eep:stop_tracing(). 
$ scp -C $PWD/file_name.trace desktop: 

Mở máy tính để bàn:

1> eep:convert_tracing("file_name"). 
$ kcachegrind callgrind.out.file_name 
Các vấn đề liên quan