$_[0]->YYData と $_[0]->{USER}

$_[0]->YYData 経由だと遅くなるらしい


$_[0]->YYData を使った場合のコード

%%
input:    #empty
        | input line
;

line:     '\n'        { $_[1] }
        | exp '\n'    { print "$_[1]\n" }
        | error '\n'  { $_[0]->YYErrok  }
;

exp:      NUM
;

%%

sub benchmark {
    my($self)=shift;

    for (my $i = 0; $i < 100000; $i++) {
        $self->YYData->{$i} = 1;
    }
}

sub Run {
    my($self)=shift;

    $self->benchmark();
    #$self->YYParse( yylex => \&_Lexer, yyerror => \&_Error );
}

my($t)=new Test;
$t->Run;

$_[0]->{USER} を使った場合のコード

%%
input:    #empty
        | input line
;

line:     '\n'        { $_[1] }
        | exp '\n'    { print "$_[1]\n" }
        | error '\n'  { $_[0]->YYErrok  }
;

exp:      NUM
;

%%

sub benchmark {
    my($self)=shift;

    for (my $i = 0; $i < 100000; $i++) {
        #$self->YYData->{$i} = 1;
        $self->{$i} = 1;
    }
}

sub Run {
    my($self)=shift;

    $self->benchmark();
    #$self->YYParse( yylex => \&_Lexer, yyerror => \&_Error );
}

my($t)=new Test;
$t->Run;

$_[0]->YYData を使った場合の実行結果

real	0m4.918s
user	0m4.690s
sys	0m0.080s

$_[0]->{USER} を使った場合の実行結果

real	0m1.843s
user	0m1.760s
sys	0m0.070s