inline: Use caching of inlined pages to speed up builds of inlines that include feeds.
authorJoey Hess <joey@gnu.kitenet.net>
Tue, 17 Nov 2009 06:29:28 +0000 (01:29 -0500)
committerJoey Hess <joey@gnu.kitenet.net>
Tue, 17 Nov 2009 06:29:28 +0000 (01:29 -0500)
Speedup of about 25% for small inlines; could be much larger for inlines of
many, or complex pages.

Not bloating memory with excessive memoization data was the key to this.
The method chosen does not squeeze out every erg of speed possible when
inlines are nested, but that's rare. It uses less memory than other
optimisation hacks (I'm looking at you,
f937c1fb8074a512d8bb788fa275f5e90595cd47 !) already used in inline.pm.

IkiWiki/Plugin/inline.pm
debian/changelog

index f89209a1b70e07e6bdbc65f95abdb6e685e66dbb..29729a4147412a3a6d423d0403e6b21f9f80f1b1 100644 (file)
@@ -423,6 +423,8 @@ sub preprocess_inline (@) {
                }
        }
        
                }
        }
        
+       clear_inline_content_cache();
+
        return $ret if $raw || $nested;
        push @inline, $ret;
        return "<div class=\"inline\" id=\"$#inline\"></div>\n\n";
        return $ret if $raw || $nested;
        push @inline, $ret;
        return "<div class=\"inline\" id=\"$#inline\"></div>\n\n";
@@ -437,25 +439,42 @@ sub pagetemplate_inline (@) {
                if exists $feedlinks{$page} && $template->query(name => "feedlinks");
 }
 
                if exists $feedlinks{$page} && $template->query(name => "feedlinks");
 }
 
+{
+my %inline_content;
+my $cached_destpage="";
+
 sub get_inline_content ($$) {
        my $page=shift;
        my $destpage=shift;
        
 sub get_inline_content ($$) {
        my $page=shift;
        my $destpage=shift;
        
+       if (exists $inline_content{$page} && $cached_destpage eq $destpage) {
+               return $inline_content{$page};
+       }
+
        my $file=$pagesources{$page};
        my $type=pagetype($file);
        my $file=$pagesources{$page};
        my $type=pagetype($file);
+       my $ret="";
        if (defined $type) {
                $nested++;
        if (defined $type) {
                $nested++;
-               my $ret=htmlize($page, $destpage, $type,
+               $ret=htmlize($page, $destpage, $type,
                       linkify($page, $destpage,
                       preprocess($page, $destpage,
                       filter($page, $destpage,
                       readfile(srcfile($file))))));
                $nested--;
                       linkify($page, $destpage,
                       preprocess($page, $destpage,
                       filter($page, $destpage,
                       readfile(srcfile($file))))));
                $nested--;
-               return $ret;
        }
        }
-       else {
-               return "";
+       
+       if ($cached_destpage ne $destpage) {
+               clear_inline_content_cache();
+               $cached_destpage=$destpage;
        }
        }
+       return $inline_content{$page}=$ret;
+}
+
+sub clear_inline_content_cache () {
+       %inline_content=();
+}
+
 }
 
 sub date_822 ($) {
 }
 
 sub date_822 ($) {
index 1abd4de4dc4c8244049442d83c5762657f62ea52..31c28941a0dcaba52c4d5d877cb55c2533f59c01 100644 (file)
@@ -4,6 +4,9 @@ ikiwiki (3.20091114) UNRELEASED; urgency=low
     enabled.
   * meta: Allow use of DESCRIPTION in templates to get at the meta description
     value. (Thanks, NicolasLimare)
     enabled.
   * meta: Allow use of DESCRIPTION in templates to get at the meta description
     value. (Thanks, NicolasLimare)
+  * inline: Use caching of inlined pages to speed up builds of inlines that
+    include feeds. Speedup of about 25% for small inlines; could be much
+    larger for inlines of many, or complex pages.
 
  -- Joey Hess <joeyh@debian.org>  Mon, 16 Nov 2009 15:46:45 -0500
 
 
  -- Joey Hess <joeyh@debian.org>  Mon, 16 Nov 2009 15:46:45 -0500