Optmised loadindex by caching the page name in the index.
authorJoey Hess <joey@kitenet.net>
Sat, 16 Nov 2013 16:48:07 +0000 (12:48 -0400)
committerJoey Hess <joey@kitenet.net>
Sat, 16 Nov 2013 16:48:11 +0000 (12:48 -0400)
I have benchmarked the pagename() call this avoids taking up to 2 seconds
for a loadindex in a large wiki. The total loadindex for that wiki was
6.46s, so this is a significant improvment.
Even on a smaller site, this reduces the refresh time from 1.69 to 1.52
seconds.

The only breakage risk here is that pagename() can change the page name
it calculates due to setup changes. But in the case of a setup change, the
whole site is rebuilt. So the cached page name is not used in that
case.

IkiWiki.pm
debian/changelog

index 9ccb92a4de41721d2adbec29bffa18f5582ac63f..af8e07d7fcf184d0de67febd11ba43825bfa558b 100644 (file)
@@ -1781,7 +1781,8 @@ sub enable_commit_hook () {
 
 sub loadindex () {
        %oldrenderedfiles=%pagectime=();
-       if (! $config{rebuild}) {
+       my $rebuild=$config{rebuild};
+       if (! $rebuild) {
                %pagesources=%pagemtime=%oldlinks=%links=%depends=
                %destsources=%renderedfiles=%pagecase=%pagestate=
                %depends_simple=%typedlinks=%oldtypedlinks=();
@@ -1821,10 +1822,16 @@ sub loadindex () {
 
        foreach my $src (keys %$pages) {
                my $d=$pages->{$src};
-               my $page=pagename($src);
+               my $page;
+               if (exists $d->{page} && ! $rebuild) {
+                       $page=$d->{page};
+               }
+               else {
+                       $page=pagename($src);
+               }
                $pagectime{$page}=$d->{ctime};
                $pagesources{$page}=$src;
-               if (! $config{rebuild}) {
+               if (! $rebuild) {
                        $pagemtime{$page}=$d->{mtime};
                        $renderedfiles{$page}=$d->{dest};
                        if (exists $d->{links} && ref $d->{links}) {
@@ -1895,6 +1902,7 @@ sub saveindex () {
                my $src=$pagesources{$page};
 
                $index{page}{$src}={
+                       page => $page,
                        ctime => $pagectime{$page},
                        mtime => $pagemtime{$page},
                        dest => $renderedfiles{$page},
index fcd47494d19bc547d06033646fcb05d8fab58178..0f6a44c30f8385d9eb16787bcfe62f08c029deec 100644 (file)
@@ -5,6 +5,7 @@ ikiwiki (3.20130904.2) UNRELEASED; urgency=low
   * Fixed unncessary tight loop hash copy in saveindex where a pointer
     can be used instead. Can speed up refreshes by nearly 50% in some
     circumstances.
+  * Optmised loadindex by caching the page name in the index.
 
  -- Joey Hess <joeyh@debian.org>  Thu, 05 Sep 2013 10:01:10 -0400