2010-11-25 2 views
1

:하위 루틴 인수가 외부 변수보다 느리게 사용되는 이유는 무엇입니까? 다음 코드를 실행

use strict; 
use warnings; 
use Benchmark; 

my $defaultArray = [1,2,3,4]; 
sub VARIABLE { 
    my $arrayref = @_ ? $_[0] : $defaultArray; 
    return $arrayref->[0].$arrayref->[1].$arrayref->[2].$arrayref->[3]; 
} 

Benchmark::cmpthese(
    -10, 
    { 
    VARIABLE_DEFAULT => sub { VARIABLE() }, 
    VARIABLE_NODEFAULT => sub { VARIABLE([4,3,2,1]) }, 
    } 
); 

를 내가 얻을 다음 벤치 마크 결과 :

      Rate VARIABLE_NODEFAULT VARIABLE_DEFAULT 
VARIABLE_NODEFAULT 313631/s     --    -74% 
VARIABLE_DEFAULT 1210501/s    286%     -- 

이유는 무엇 NODEFAULT 버전 순전히 DEFAULT 하나보다 느리게?

+1

다른 주제를하지만,이 작업을 수행 할 수 있다는 것을 잊지 마세요 : 다음과 같이 비교 '' ', @ $ arrayref' 가입 할 수 있습니다. – FMc

답변

4

전화 할 때마다 새로운 익명 배열 참조를 만들기 때문에 속도가 훨씬 느립니다. 이에 코드를 변경합니다

use strict; 
use warnings; 
use Benchmark; 

my $defaultArray = [1,2,3,4]; 
sub VARIABLE { 
    my $arrayref = @_ ? $_[0] : $defaultArray; 
    return $arrayref->[0].$arrayref->[1].$arrayref->[2].$arrayref->[3]; 
} 

Benchmark::cmpthese(
    -10, 
    { 
    VARIABLE_DEFAULT => sub { VARIABLE() }, 
    VARIABLE_NODEFAULT => sub { VARIABLE($defaultArray) }, 
    } 
); 

을 그리고 당신의 벤치 마크가 끝나는 훨씬 좋네요 :

     Rate VARIABLE_NODEFAULT VARIABLE_DEFAULT 
VARIABLE_NODEFAULT 1065824/s     --    -2% 
VARIABLE_DEFAULT 1085082/s     2%     -- 
+3

젠장. 11 초 더 빨랐어. ;) – musiKk

+0

Yap, 찾았습니다 :) –

1

알 수 있습니다. 이것은 외부 변수 대신에 매개 변수를 사용하는 것이 아니라 테스트 자체 : VARIABLE_NODEFAULT => sub { VARIABLE([4,3,2,1]) } 이 줄에서는 배열을 만듭니다. 이 중 하나가 아닙니다 : VARIABLE_DEFAULT => sub { VARIABLE() },.

4

DEFAULT 하나와 NODEFAULT가 할당하는 동안 모든 호출에 대해 동일한 배열을 사용하기 때문에 내가 말하고 싶지만 및 모든 호출에 대해 배열의 여유 공간.

Benchmark::cmpthese(
    -10, 
    { 
    VARIABLE_DEFAULT => sub { VARIABLE() }, 
    VARIABLE_NODEFAULT => sub { VARIABLE($defaultArray) }, 
    } 
); 
 
         Rate VARIABLE_NODEFAULT VARIABLE_DEFAULT 
VARIABLE_NODEFAULT 1619427/s     --    -4% 
VARIABLE_DEFAULT 1689428/s     4%     -- 
+1

넵 : 질문을 닫습니다.하지만 둘 다 + –

+3

@OMG_peanuts : "질문에 답변했습니다."는 질문을 닫는 유효한 이유로 여기지 않습니다. 그렇게하기 위해 필요한 4 개의 투표 마감을 얻으려고하지 마십시오. 대신, 옆에있는 녹색 체크 표시를 클릭하여 답변 중 하나를 "수락"해야합니다. –

+1

@Dave Sherohman : 네, 맞습니다. –