2011-09-13 2 views
2

더 효율적인 성명서 -> goto & 재미 ($ val) 또는 재미 ($ val) in perl? 더 나은 성능을 위해 어떤 문장을 사용해야합니까? 답변을 알려주세요.

+5

그들은 같은 일을하지 않는,이 기껏 어쨌든 조기 최적화처럼 보이지만. – geoffspear

+7

실제로 무엇을하려고합니까? 'goto '를 언제 사용해야하는지 모를 경우, 거의 사용하지 않으려 고합니다. – geoffspear

답변

11

나는 이것이 잘못된 질문이라고 생각한다.

양식 fun($val)은 perl에서 다른 서브 루틴을 호출하는 표준 방법입니다.

양식 goto &func은 일반적으로 현재 스택 프레임을 제거하면서 다른 서브 시스템으로 제어를 전송하는 데 사용됩니다. 또한 @_은 호출 된 루틴으로 변경되지 않고 전달됩니다.

스택 프레임의 제거는 &func는 t가 goto 수행 루틴의 호출에 의해 호출 된 것을 생각할 수 있도록 caller()가 표시되지 것을 의미한다. 또한 디버거에서 백 트레이스를 수행해도 goto을 수행하는 루틴이 표시되지 않습니다.

호출 스택 프레임을 유지하면서 현재 설정이 @_ 인 함수로 제어를 전달하려면 return &func을 사용하십시오.

my $label = &func($val); 
goto $label; 

이것은 가능성이 Can't find label ... 오류를 줄 것이다 :

양식 goto &func($val)는 다음과 같이 구문 분석됩니다.

예 :

sub func { 
    my $x = shift; 
    print "x = $x\n"; 
    my ($package, $file, $line) = caller(); 
    print "caller file: $file, line: $line\n"; 
} 

sub foo { 
    goto &func("from goto bar"); 
} 

sub baz { 
    return &func; 
} 

sub quux { 
    goto &func; 
} 

baz("from baz"); 
quux("from quux"); 
foo("from foo"); 
2

항상 사용 fun($val). 더 읽기 쉽고 성능 차이가 작아서 문제가된다면 Perl을 처음 사용해서는 안됩니다. 말할 것도없이 goto 버전은 어쨌든 당신이 의도 한대로하지 않습니다. 그들은 이 아니며 동의어입니다. 당신이 이미 서브 루틴의 파견을 결정하는 코드를 프로파일 링 한 않는

당신의 두 가지 방법을 비교하는 코드를 벤치마킹 한 (!이 될 가능성이 매우 가능성이) 당신의 CPU 사이클의 상당 부분을 차지 된다 특정 상황에서 문제가 발생하기에 충분한 차이가 있음을 보증하기 위해 (매우 적은 가능성이 있습니다!) 매우 조기에 최적화 된 것입니다. 성능 문제가있는 경우, 작고 작은 미세 최적화에 대해 걱정하지 말고 알고리즘을 살펴보십시오.

3

내 인생의 서프라이즈. no-goto 버전은 더 빠를 것 같습니다. 깊은 재귀를 제외하고 일반 함수 호출 외에 다른 것을 사용하는 이유는 거의 없습니다.

   Rate with_goto no_goto 
with_goto 56818/s  --  -21% 
no_goto 71942/s  27%  -- 

이 함께 테스트 :

use Benchmark ':all'; 

sub with_goto { $_[0]-- and goto &with_goto } 
sub no_goto { $_[0]-- and  & no_goto } 

cmpthese(100000, { 
    with_goto => '$_=98; with_goto($_)', 
    no_goto => '$_=98; no_goto($_)', 
}); 

(여전히 당황)

+3

비정상적인 방식으로 스택을 찢어 내야하므로 시간이 오래 걸리는 것은 놀라운 일이 아닙니다. 얼마나 더 길어? (1/56818-1/71942)/98 = 0.000,0000,377; 또는 0.4ns. 진지하게, 우리는 왜 속도에 대해 이야기하고 있는가? – ikegami

+0

나의 순진한 마음으로, 탑 프레임을 교체하는 것은 push (amortized)만큼 오래 걸리는 반면 리턴하는 것은 일정한 시간 대 linear입니다. 그러므로 놀랍습니다. –

관련 문제