About 12% of ikiwiki runtime was spent in pagespec_match. It was evaling
the same pagespec code over and over again. This changes pagespec_translate
to return memoized, precompiled functions that can be called to match against
a given pagespec.
This also allows getting rid of the weird variable scoping trick that had
to be in effect for pagespec_translate to be called -- the variables are
now just fed into the function it returns.
On my laptop, this drops build time for the docwiki from about 60 to 50
seconds.
} #}}}
sub pagespec_translate ($) { #{{{
} #}}}
sub pagespec_translate ($) { #{{{
- # This assumes that $page and @params are in scope in the function
- # that evalulates the translated pagespec code.
my $spec=shift;
# Support for old-style GlobLists.
my $spec=shift;
# Support for old-style GlobLists.
}
elsif ($word =~ /^(\w+)\((.*)\)$/) {
if (exists $IkiWiki::PageSpec::{"match_$1"}) {
}
elsif ($word =~ /^(\w+)\((.*)\)$/) {
if (exists $IkiWiki::PageSpec::{"match_$1"}) {
- $code.="IkiWiki::PageSpec::match_$1(\$page, ".safequote($2).", \@params)";
+ $code.="IkiWiki::PageSpec::match_$1(\$page, ".safequote($2).", \@_)";
}
else {
$code.=' 0';
}
}
else {
}
else {
$code.=' 0';
}
}
else {
- $code.=" IkiWiki::PageSpec::match_glob(\$page, ".safequote($word).", \@params)";
+ $code.=" IkiWiki::PageSpec::match_glob(\$page, ".safequote($word).", \@_)";
+ return eval 'sub { my $page=shift; '.$code.' }';
} #}}}
sub pagespec_match ($$;@) { #{{{
} #}}}
sub pagespec_match ($$;@) { #{{{
unshift @params, 'location';
}
unshift @params, 'location';
}
- my $ret=eval pagespec_translate($spec);
+ my $sub=pagespec_translate($spec);
return IkiWiki::FailReason->new('syntax error') if $@;
return IkiWiki::FailReason->new('syntax error') if $@;
+ return $sub->($page, @params);
} #}}}
sub pagespec_valid ($) { #{{{
my $spec=shift;
} #}}}
sub pagespec_valid ($) { #{{{
my $spec=shift;
- # used by generated code
- my $page="";
- my @params;
-
- eval pagespec_translate($spec);
+ my $sub=pagespec_translate($spec);
* Close meta tag for redir properly.
* smiley: Detect smileys inside pre and code tags, and do not expand.
* inline: Crazy optimisation to work around slow markdown.
* Close meta tag for redir properly.
* smiley: Detect smileys inside pre and code tags, and do not expand.
* inline: Crazy optimisation to work around slow markdown.
+ * Precompile pagespecs, about 10% overall speedup.
-- martin f. krafft <madduck@debian.org> Sun, 02 Mar 2008 17:46:38 +0100
-- martin f. krafft <madduck@debian.org> Sun, 02 Mar 2008 17:46:38 +0100