더 효율적인 성명서 -> goto & 재미 ($ val) 또는 재미 ($ val) in perl? 더 나은 성능을 위해 어떤 문장을 사용해야합니까? 답변을 알려주세요.
답변
나는 이것이 잘못된 질문이라고 생각한다.
양식 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");
항상 사용 fun($val)
. 더 읽기 쉽고 성능 차이가 작아서 문제가된다면 Perl을 처음 사용해서는 안됩니다. 말할 것도없이 goto
버전은 어쨌든 당신이 의도 한대로하지 않습니다. 그들은 이 아니며 동의어입니다. 당신이 이미 서브 루틴의 파견을 결정하는 코드를 프로파일 링 한 않는
내 인생의 서프라이즈. 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($_)',
});
(여전히 당황)
비정상적인 방식으로 스택을 찢어 내야하므로 시간이 오래 걸리는 것은 놀라운 일이 아닙니다. 얼마나 더 길어? (1/56818-1/71942)/98 = 0.000,0000,377; 또는 0.4ns. 진지하게, 우리는 왜 속도에 대해 이야기하고 있는가? – ikegami
나의 순진한 마음으로, 탑 프레임을 교체하는 것은 push (amortized)만큼 오래 걸리는 반면 리턴하는 것은 일정한 시간 대 linear입니다. 그러므로 놀랍습니다. –
- 1. 사전을 "key = val & key = val ..."문자열에 연결하십시오.
- 2. 더 빠른, 정규식 검색 또는 배열 검색 중 어느 것입니까?
- 3. C# 일반 목록 및 ASP Repeater Fun
- 4. 더 빠른가, 잠금 기능이있는 함수 호출 또는 가상 호출 중 어느 것입니까?
- 5. 더 빠른보기 또는 하위 쿼리는 어느 것입니까?
- 6. html (val), text (val), append (content) 및 기타 내용
- 7. Firefox <input type = "file"/> 호출 jquery val "NS_ERROR_DOM_SECURITY_ERR"
- 8. jQuery .val() Selector Confusion
- 9. Android : tgid task_struct val
- 10. jquery : Alert val
- 11. jquery에서 val()이란 무엇입니까?
- 12. Z3의 효율적인 실행을 나타내는 통계는 어느 것입니까?
- 13. 어느 것이 더 빠를 것입니까?
- 14. 어느 쪽이 더 낫습니까? do {} while (0); 또는 goto xy;
- 15. "".join (반대 (val)) 대 val [:: - 1] ... 어떤 파이썬입니까? 명시 파이썬</em>의 <em>선에 따라
- 16. 여러 텍스트 상자에서 jQuery 검색 val()
- 17. val()과 text()의 차이
- 18. $ ('# idField') .JQuery 대화 상자에서 val()
- 19. Jquery - Val()의 텍스트 바꾸기
- 20. Sitefinity 웹 사이트 - 웹 응용 프로그램 프로젝트 - app_code fun!
- 21. 더 빠른, key_cache 또는 OS 캐시는 어느 것입니까?
- 22. jQuery 1.6, .val() 동작이 변경 되었습니까?
- 23. Vaadin 어플리케이션, Tomcat 또는 Jetty에 더 적합한 것은 어느 것입니까?
- 24. 더 빠른 재 작성 또는 폴더 기반 URL은 어느 것입니까?
- 25. 더 빠른 asp.net mvc json 또는 json.net은 어느 것입니까?
- 26. jQuery val()이 키보드를 엽니 다.
- 27. 우선 순위는 maxRequestLength 또는 maxAllowedContentLength 중 어느 것입니까?
- 28. 대용량 데이터베이스를위한 더 나은 플랫폼은 어느 것입니까
- 29. Solr + PHP를위한 더 나은 클라이언트는 어느 것입니까?
- 30. jquery :`select2`의 onchange 값을 변경하십시오. IF $ ('# select2') .Val() <$ ('select1') .Val()
그들은 같은 일을하지 않는,이 기껏 어쨌든 조기 최적화처럼 보이지만. – geoffspear
실제로 무엇을하려고합니까? 'goto '를 언제 사용해야하는지 모를 경우, 거의 사용하지 않으려 고합니다. – geoffspear