2017-11-16 12 views
0
에서 함수 호출의 실행 시간을 측정
+0

유닉스 또는 Windows? – stevieb

+0

시스템은 유닉스입니다 – Firefly

+0

get_entities()가 다음 명령문에 도달 할 때 완료되지 않는 단일 스레드 프로그램에는 방법이 없습니다. – user3243135

답변

2

편집하면 질문이 상당히 복잡해집니다.

표준으로 perl은 순차적으로 실행됩니다. 명령에 25 초가 걸리면 나머지 코드는 준비 될 때까지 기다립니다.

하지만 때로는 여러 가지 이유로 시간 초과를 직접 작성하려고합니다. 당신이 할 수있는 여러 가지 방법이있다 :

alarm 그리고 당신은 당신이 당신의 핸들러 내에서 수행 할 수있는 작업을 제한하고 신호 처리기

#!/usr/bin/env perl 

use strict; 
use warnings; 

$SIG{'ALRM'} = \&handle_alarm; 

my $we_are_snoozing = 1; 

sub handle_alarm { 

    print "Caught SIGALRM\n"; 
    $we_are_snoozing = 0; 
} 

sub have_a_snooze { 
    while ($we_are_snoozing) { 
     print "Zzzz\n"; 
     sleep 10; 
    } 
} 


alarm 25; 
have_a_snooze; 
print "Done\n"; 

는 - 최소한의 유지. 그러나 alarmSIGALRM (kill으로 생성 될 수도 있음)을 생성하며 프로세스가이를 처리하고 처리 할 수 ​​있습니다.

threads

스레드는 병렬로 또는 비동기 적으로 실행하는 코드의 일부를 분사 할 수 있습니다. 이 기능은 두 가지 리소스 사용 모두에 유용하지만 무기한 대기 할 가치가없는 것에 직면 할 때도 유용합니다.

#!/usr/bin/env perl 

use strict; 
use warnings; 

use threads; 
use threads::shared; 

my $we_are_snoozing : shared; 
$we_are_snoozing = 1; 

sub have_a_snooze { 
    while ($we_are_snoozing) { 
     print "Zzzz\n"; 
     sleep 10; 
    } 
} 


my $thr = threads -> create (\&have_a_snooze); 

sleep 5; 

if ($thr -> is_joinable) { 
    print "Thread exited normally\n"; 
    $thr -> join; 
} 
else { 
    print "Thread still running, detaching it\n"; 
    $we_are_snoozing = 0; 
    $thr -> detach; 
} 

IO::Socket 및 타임 아웃을 원하는에 대한 일반적인 이유

can_read, 단순히 IO를 기다리고 있습니다.

IO::Socket와 타임 아웃 처리하기 매우 쉽습니다 :

#!/usr/bin/env perl 
use strict; 
use warnings; 

my $pid = open (my $input, '-|', "some_command"); 
my $select = IO::Select -> new ($input); 
while ($select -> can_read(10)) { 
    my $line = <$input>; 
    print $line; 
} 

이 처음되지는 마지막 결과 후 10 초 시간 초과됩니다. 그러나 그것은 유용 할 수도 있습니다.

4

는 당신이 봤어?

my $start = time; 
get_entities(); 
my $duration = time - $start; 

아니면 더 정교한 것을 찾고 계셨습니까?

+1

'더 정교한'- '경보'를 찾고 신호 처리기가 대답 일 수 있습니다. – Sobrique

+0

@Dave Cross 더 정교하고, 내 질문을 편집하여 webhook에서 작업 중입니다. – Firefly

+1

또한 더 세밀한 타이밍이 필요한 경우 Time :: HiRes가 유용 할 수 있습니다. – user3243135