2010-12-01 8 views
12

저는 속도를 위해 프로그램의 다른 부분을 벤치마킹하는 데 관심이 있습니다. info (statistics) 및 erlang : now()를 사용하여 시도했습니다.ERLANG - 타이밍 어플리케이션

avg 속도가 얼마인지 마이크로 초까지 알아야합니다. 왜 내가 쓰는 스크립트에 문제가 있는지 나는 모른다.

어디서나 시작하고 어디에서나 종료 할 수 있어야합니다. 병렬로 최대 4 번 실행되는 프로세스에서 시작하려고 할 때 문제가 발생했습니다.

이미이 문제를 해결 한 사람이 있습니까?

편집 :

누군가가 그것을 할 수있는 스크립트를 제공 할 수 있는지 현상금을 제공 할 의사가

. 다중 프로세스를 통해 IT가 필요합니다. ' 나는 timer와 같은 함수를 받아 들일 수 없다. 최소한 필자가 본 구현에서. IT는 하나의 프로세스 만 통과하며 심지어 전체 프로그램의 전체 테스트를 수행하려면 몇 가지 주요 편집이 필요합니다. 희망을 충분히 분명히했으면 좋겠다.

+0

ungivens의 몇 가지 있습니다 : 이것을인가 생산 시스템? 'eprof' 및 * 특히 *'fprof'는 실행 중에 성능이 저하됩니다. 둘 다 새로 산란 처리를 따라갈 수 있습니다. 그러나 네트워크 왕복과 같은 다른 것을 측정하고 싶을 수도 있습니다! 가장 쉬운 방법은 측정 할 함수 주위에'timer : tc' 호출을 삽입하는 것입니다. 또는'erlang : now()'를 가져 와서 다른 프로세스로 보내면 측정 작업을 수행 할 수 있습니다. –

+0

페이지에서 eprof 스크립트 (또는 연습)가 더 낮습니다. :) –

답변

38

여기 당신을 위해, 가능성이 가장 쉬운 솔루션을 eprof을 사용하는 방법은 다음과 같습니다

먼저 당신은 거기 대부분의 응용 프로그램처럼, 그것을 시작해야합니다

23> eprof:start(). 
{ok,<0.95.0>} 

Eprof 두 프로파일 모드를 지원합니다. 그것을 호출하고 특정 기능을 프로파일 링하도록 요청할 수 있지만, 다른 프로세스가 모든 기능을 망칠 것이기 때문에 사용할 수 없습니다. 우리는 프로파일 링을 수동으로 시작해야하고 멈출시기를 알려야합니다 (이것이 쉬운 스크립트가없는 이유입니다).

이것은 eprof가 쉘에서 실행되고 생성되는 모든 것을 프로파일하도록 지시합니다. 새로운 프로세스가 여기에 포함될 것입니다.

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

우리는 이제 기능 실행이 완료되면 프로파일 링을 중지 eprof을 알 수 있습니다 : 나는 몇 초 동안 서로 통신하는 약 4 프로세스를 생성합니다 내가 가진 어떤 임의의 멀티 기능을 실행합니다.

26> eprof:stop_profiling(). 
profiling_stopped 

그리고 로그가 필요합니다. Eprof는 기본적으로 화면에 인쇄합니다. eprof:log(File)으로 파일에 기록하도록 요청할 수도 있습니다. 그런 다음 결과를 분석하도록 말할 수 있습니다. 우리는 옵션 total (더 많은 옵션에 대한 manual 참조) 단일 테이블에 모든 프로세스의 실행 시간을 축소하도록 지시 :

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] 

그리고 당신은 시간 (50 %)의 대부분이 소비되는 것을 볼 수 있습니다 in dict : store/3. 결과를 출력하는 데 16.67 %가 사용되며, erl_eval이 16.67 %를 차지합니다 (이 때문에 쉘에서 짧은 함수를 실행하면 구문 분석이 실행되는 것보다 길어집니다).

그런 다음 거기에서 시작할 수 있습니다. Erlang으로 런타임을 프로파일 링하는 기본 사항입니다. 주의해서 처리하면 eprof는 프로덕션 시스템이나 너무 오래 실행되는 기능에 상당한로드가 될 수 있습니다. 특히 프로덕션 시스템에서.결과적으로이 https://raw.github.com/virtan/eep/master/doc/sshot1.png 같은 https://github.com/virtan/eep

당신은 얻을 것이다 뭔가 :

+0

좋은 직장 사람, 그것을 밖으로 시도, 좋은 외모 .. 질문 : 왜 일부 프로세스 '0 내 전화에 전화를합니까? 나는리스트와 같은 다른 재미를 얻기 위해서 호출되어야한다는 것을 안다. 뭔가 확실한가요? 아니면 내 prog에 조금 더 밀교. – BAR

+0

코드 없이는 말할 수 없었습니다. 코드를 직접 본 기억이 없습니다. –

3

일반적인 방법은 timer : tc입니다. Here은 좋은 설명입니다.

+0

프로세스를 가로 질러 실행해야합니다. – BAR

+1

'eprof'는 여러분이 원하는 도구입니다. –

0

나는 당신에게이 도구를 추천 할 수 있습니다. 실행중인 시스템의 모든 프로세스를 프로파일 링을위한 단계 명령에 의해

단계 : 목표 시스템에서

는 :

바탕 화면에서
1> eep:start_file_tracing("file_name"), timer:sleep(20000), eep:stop_tracing(). 
$ scp -C $PWD/file_name.trace desktop: 

는 :

1> eep:convert_tracing("file_name"). 
$ kcachegrind callgrind.out.file_name