summaryrefslogtreecommitdiff
path: root/IkiWiki
diff options
context:
space:
mode:
authorJoey Hess <joey@kodama.kitenet.net>2008-03-21 04:48:26 -0400
committerJoey Hess <joey@kodama.kitenet.net>2008-03-21 04:48:26 -0400
commitf937c1fb8074a512d8bb788fa275f5e90595cd47 (patch)
tree3f6b5b137c33528df10450bc95ff2829bf865622 /IkiWiki
parent0b9e849aba38f0695491ad5ca27de11632627ffe (diff)
crazy optimisation to work around slow markdown
Markdown is slow. Especially if it has to process an enormous page. The most common enormous page is currently the recentchanges page, which gets processed a lot, and contains very little actual markdown. Most of it is a big <div>, which markdown skips ... slowly. This is a rather sick optimisation to work around markdown's speed issues. Now inline inserts a small, dummy div, allows markdown to quickly render the actual page content, then replaces the dummy with the actual inlined pages later. Results: Rendering just a recentchanges page, with diffs included, dropped from 4.5 seconds to 2.7 seconds on my laptop. Building the entire wiki dropped from 46.6 seconds to 39.5 seconds. (It would be better if inline were a *post*-processor directive.)
Diffstat (limited to 'IkiWiki')
-rw-r--r--IkiWiki/Plugin/inline.pm15
1 files changed, 14 insertions, 1 deletions
diff --git a/IkiWiki/Plugin/inline.pm b/IkiWiki/Plugin/inline.pm
index c7107d664..0002371c1 100644
--- a/IkiWiki/Plugin/inline.pm
+++ b/IkiWiki/Plugin/inline.pm
@@ -10,6 +10,7 @@ use URI;
my %knownfeeds;
my %page_numfeeds;
+my @inline;
sub import { #{{{
hook(type => "getopt", id => "inline", call => \&getopt);
@@ -19,6 +20,7 @@ sub import { #{{{
call => \&IkiWiki::preprocess_inline);
hook(type => "pagetemplate", id => "inline",
call => \&IkiWiki::pagetemplate_inline);
+ hook(type => "format", id => "inline", call => \&format);
# Hook to change to do pinging since it's called late.
# This ensures each page only pings once and prevents slow
# pings interrupting page builds.
@@ -51,6 +53,15 @@ sub checkconfig () { #{{{
}
} #}}}
+sub format (@) { #{{{
+ my %params=@_;
+
+ # Fill in the inline content generated earlier. This is actually an
+ # optimisation.
+ $params{content}=~s!<div class="inline" id="([^"]+)"></div>!$inline[$1]!g;
+ return $params{content};
+} #}}}
+
sub sessioncgi () { #{{{
my $q=shift;
my $session=shift;
@@ -304,7 +315,9 @@ sub preprocess_inline (@) { #{{{
}
}
- return $ret;
+ return $ret if $raw;
+ push @inline, $ret;
+ return "<div class=\"inline\" id=\"$#inline\"></div>\n\n";
} #}}}
sub pagetemplate_inline (@) { #{{{