2010-04-25 5 views
3

나는이 질문을 '이 벽돌을 보아라. 그것이 어떤 유형의 집입니까? '모듈을 사용하지 않고 서브 루틴을 프로파일 링하려면 어떻게해야합니까?

다음과 같은 상황이 있습니다. 프로파일 러에 액세스 할 수없는 서브 루틴 (심지어 Devel::DProf)이나 Time::HiRes까지 프로파일 링하도록 요청 받았습니다. 이 연습의 목적은 병목 현상을 찾아내는 것입니다.

지금은 time 함수의 결과와 함께 로그 항목과 파일을 종료하는 각 하위의 시작과 끝에 인쇄 문을 뿌리고 있습니다. 이상적은 아니지만 상황을 고려해 볼 때 가장 좋습니다. 적어도 각 하위가 호출되는 횟수를 볼 수 있습니다.

코드는 Unix에서 실행됩니다. 내가 필요로하는 가장 가까운 것은 perlfaq8이지만 도움이되지 않는 것 같습니다 (예 : syscall을 만드는 법을 모르며 코드 타이밍에 예기치 않게 영향을 미칠지 궁금합니다).

하지 전형적인 일상 SO 질문 ...

+0

@FM : 좋은 생각입니다.하지만 그것에 대해 생각해 봐야합니다. 그들은 내가 할 수있는 한 천 번 이상 잘 돌아갈 것입니다 (코드는 엉망입니다). 문제는 이러한 잠수정과 그 점수가 상호 연결되어 있다는 것입니다. – Zaid

+3

글쎄, 당신은 모듈이하는 것과 똑같은 일을합니다. 그들의 근원을보십시오. –

+0

Time :: HiRes에 액세스 할 수 없습니까? Perl 5.6을 사용하고 있습니까? 그 후 Perl과 함께 설치된 모듈의 일부였습니다. – MkV

답변

7

This technique should work.

는 기본적으로, 아이디어는 당신이 -d 플래그와 펄을 실행하는 경우, 그것은 디버거로 전환합니다. 그런 다음 프로그램을 실행하면 ctrl-Break 또는 Ctrl-C를 사용하여 수행중인 작업을 중간에 중단해야합니다. 그런 다음 스택을 표시하기 위해 T을 입력하고 원하는 경우 계속하기 전에 다른 변수를 검사 할 수 있습니다.

약 10 회 또는 20 회 수행하십시오. 중요한 코드 행 (또는 원하는 경우 임의의 함수)은 스택 샘플의 해당 백분율에 상당한 시간을 소비하므로 대략 놓치지 않습니다.

예를 들어 코드 줄 (일반적으로 함수 호출)의 비용이 20 %인데 프로그램을 20 번 일시 중지하면 4 개의 스택 샘플에 해당 줄이 표시되거나 1.8 개의 샘플이 제공됩니다. 해당 행을 실행하지 않거나 실행 빈도를 줄이면 절약 할 수있는 시간은 전체 실행 시간을 20 % 단축합니다.

그런 다음 반복하여 더 많은 문제를 찾을 수 있습니다.

당신은 목적이 병목 현상을 찾아내는 것이라고 말했습니까? 이 방법은 정확히 수행합니다. 함수 실행 시간을 측정하는 것은 매우 간접적 인 방법입니다.

+0

@ 자이드 : 너무 많은 작업이라고 말하는 의견으로 답하기를 원할 경우를 대비해 시험해보십시오. 그것이 얼마나 쉽고 효과적인지에 놀랄 수 있습니다. –

+0

@ 마이크 : 잘 찍었지만 상사는 시대를 원합니다. 나는 병목 현상과 과도한 체류 시간이 어디에 있는지에 관해 꽤 좋은 직감을 가지고있다. 그러나 나는 그것을 정량화 할 필요가있다. – Zaid

+0

@ Zaid : 시간을 얻으려면 전체 실행 시간 (스톱워치)을 가져 와서 백분율을 곱하십시오. 그들이 정확한 시간을 원한다면 요점을 놓치고 있습니다. 문제가있는 곳에서 꽤 좋은 직감을 느끼면 표본 추출은 당신을 옳게 증명하거나 문제가 실제로 어디 있는지 말해 줄 것입니다. –

1
  1. 지금까지,이 게시물에 꽤 좋은 예있다 syscall 같이 http://www.cpan.org/scripts/date_and_time/gettimeofday

    나는 그것이도 전에 콜을 사용한 적이없는 사람에게 충분히 명확 생각이 (자신과 같은 :

  2. 월 나는 "접근 할 필요가 없다"는 것이 무엇인지 묻는다.

    중앙 위치에 설치하는 것이 카드에없는 경우에도 일반적으로 CPAN 모듈에 액세스 할 수 있습니다. 모듈을 다운로드하는 데 문제가 있습니까? 홈 디렉토리에 설치 하시겠습니까? 모듈과 함께 소프트웨어 사용하기

    그 중 하나가 전화를 끊으면 아마 해결 될 수 있습니다 ...그것은 일부 회사 정책 인 경우에, 그 귀중한입니다 :(

+0

@DVK : 긴 이야기 짧게 : 이것은 개인적인 사용을위한 것이 아닙니다. NDS – Zaid

+0

@Zaid - 당신은 그 남자와 싸울 수 없다 : ( – DVK

+0

@Zaid - 나는 syscall을 사용하는 예제를 추가했다. 당신이 다시 사용할 수있는 것이 있는지 보아라. – DVK

0

를 글쎄, 당신은 당신의 자신의 프로파일을 작성할 수 있습니다.이 소리 그것은 나쁜 아니다. 프로파일 러는 그냥 아주 특별한 경우 디버거입니다. 당신은을 읽을 수 당신이 직접 작성해야하는 경우 좋은 첫 번째 컷 코드 perldebguts 매뉴얼 페이지를 시작합니다.

당신이, 그 또는 그녀가 그것을 모를 수 있지만 당신의 상사가 원하는 무엇을 사용하는 것입니다 원하는 무엇 Devel::NYTProf 코드를 프로파일 링하는 작업을 실제로 수행하고 부분적으로 함수를 복제 할 때까지 기다리지 않고 작업을 완료해야합니다. 그것이 어떻게 행해지는지 배우는 동안 그것의.

"개인 용도"에 대해 작성한 의견은 의미가 없습니다. 당신은 직장에서 일하고 있고, 일을 끝내야하고, 그 일을 할 수있는 자원이 필요합니다 (또는 관리자가 필요합니다). "개인 용도"는 그것에 들어 가지 않는 것 같습니다.

측정 할 소프트웨어를 실행하는 컴퓨터에 모듈을 설치하도록 거부하는 다른 사람의 질문입니까? 라이센스 문제입니까? 프로덕션 시스템에 임의의 소프트웨어를 설치할 수는 없습니까 (이해할 수 있지만 소프트웨어가 실제로 실행되기 전에 테스트를 거쳐야합니다.)

신뢰할 수있는 출처의 잘 알려진 모듈을 사용할 수없는 이유는 무엇입니까? 당신은 관리자에게 돈을 벌어서 이미 유용하고 이미 사용 가능한 것을 사용하는 방법을 발견하는 것보다 새로운 기능이 적은 새로운 프로파일 러를 코딩하는 데 더 많은 돈을 쓸 것입니까?

+0

나는'Devel :: NYTProf'가 이 작업을 공원에서 산책하십시오. 더 말할 수 있으면 좋겠지 만, 내 손과 혀가 묶여 있습니다. 어쨌든 고마워요 – Zaid

0

각 서브 루틴에 대해 R, 데이터베이스, Excel 또는 유사한 항목 (CSV가 좋은 선택 일 수 있음)으로 내보낼 수있는 형식으로 시간을보고하는 랩퍼를 작성하십시오. 이런 식으로 코드에 추가하십시오. 5.7 이하의 Perl을 사용하는 경우 (Time :: HiRes가 처음 코어에 추가되었을 때) 아래의 Time :: HiRes 함수 대신 위에 언급 한대로 syscall을 사용하십시오.

INIT { 
    sub wrap_sub { 
     no strict 'refs'; 
     my $sub = shift; 
     my $subref = *{$sub}{CODE}; 
     return sub { 
      local *__ANON__ = "wrapped_$sub"; 
      my $fsecs = Time::HiRes::gettimeofday(); 
      print STDERR "$sub,$fsecs,"; 
      if (wantarray) { 
       @return = eval { $subref->(@_) } or die [email protected]; 
      } else { 
       $return[0] = eval { $subref->(@_) } or die [email protected]; 
      } 

      $fsecs = Time::HiRes::gettimeofday(); 
      print STDERR "$fsecs\n"; 
      return wantarray ? @return : $return[0]; 
     }; 
    } 
    require Time::HiRes; 
    my @subs = qw{the subs you want to profile}; 
    no strict 'refs'; 
    no warnings 'redefine'; 
    foreach my $sub (@subs) { 
     *{$sub} = wrap_sub($sub); 
    }  
} 

당신이 윤곽을 필요로하는 서브 우퍼와 '프로파일 링 할 잠수정'을 교체하고, 마음에 베어링이 실행의 결과를 얻을 수 있습니다해야하는 경우 개방() ED 파일 대신 STDERR의 처리 사용 (유닉스에서 bourne, korn 및 bash 쉘을 사용하는) 스크립트의 출력과는 별도입니다.

perl ./myscript.pl 2>myscript.profile 
+0

위의 내용을 사용하고 거기에 2 개의 서브 루틴 이름을 넣으면'1380617457.79998'이됩니다. 위의 결과에서 2 개의 서브 루틴에 걸린 시간을 추출 할 수 없습니다. –

관련 문제