Add t/t9503/benchmark_caching_interface.pl, which benchmarks 'set' and 'get' methods from GitwebCache::SimpleFileCache, and compares them against Cache::FileCache, Cache::MemoryCache, CHI with 'File' driver, Cache::FastMmap if they are available. Includes example benchmark results. Signed-off-by: Jakub Narebski <jnareb@xxxxxxxxx> --- t/t9503/benchmark_caching_interface.pl | 132 ++++++++++++++++++++++++++++++++ 1 files changed, 132 insertions(+), 0 deletions(-) create mode 100755 t/t9503/benchmark_caching_interface.pl diff --git a/t/t9503/benchmark_caching_interface.pl b/t/t9503/benchmark_caching_interface.pl new file mode 100755 index 0000000..5a46077 --- /dev/null +++ b/t/t9503/benchmark_caching_interface.pl @@ -0,0 +1,132 @@ +#!/usr/bin/perl +use lib (split(/:/, $ENV{GITPERLLIB})); + +use warnings; +use strict; + +use File::Spec; +use File::Path; +use Benchmark qw(:all); + +# benchmark source version +sub __DIR__ () { + File::Spec->rel2abs(join '', (File::Spec->splitpath(__FILE__))[0, 1]); +} +use lib __DIR__."/../../gitweb/lib"; +use GitwebCache::SimpleFileCache; + +my $key = 'http://localhost/cgi-bin/gitweb.cgi?p=git/git.git;a=blob_plain;f=lorem.txt;hb=HEAD'; +my $value = <<'EOF'; +Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do +eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad +minim veniam, quis nostrud exercitation ullamco laboris nisi ut +aliquip ex ea commodo consequat. Duis aute irure dolor in +reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla +pariatur. Excepteur sint occaecat cupidatat non proident, sunt in +culpa qui officia deserunt mollit anim id est laborum. +EOF + +my $cache_root = __DIR__.'/cache'; +my %cache_options = ( + 'cache_root' => $cache_root, # Cache::FileCache compatibile + 'root_dir' => $cache_root, # CHI::Driver::File compatibile + 'cache_depth' => 1, # Cache::FileCache compatibile + 'depth' => 1, # CHI::Driver::File compatibile + 'default_expires_in' => 24*60*60, # Cache::Cache compatibile + 'expires_in' => 24*60*60, # CHI compatibile + 'expire_time' => 24*60*60, # Cache::FastMmap compatibile +); + +mkdir($cache_root); + +my @caches; +push @caches, GitwebCache::SimpleFileCache->new({ + 'namespace' => 'GitwebCache-SimpleFileCache', + %cache_options, +}); + +if (eval { require Cache::FileCache; 1; }) { + push @caches, Cache::FileCache->new({ + 'namespace' => 'Cache-FileCache', + %cache_options, + }); +} + +if (eval { require Cache::MemoryCache; 1; }) { + push @caches, Cache::MemoryCache->new({ + 'namespace' => 'Cache-MemoryCache', + %cache_options, + }); +} +if (eval { require CHI; 1; }) { + push @caches, CHI->new( + 'driver' => 'File', + 'namespace' => 'CHI-Driver-File', + %cache_options, + ); +} +if (eval { require Cache::FastMmap; 1 }) { + push @caches, Cache::FastMmap->new( + 'share_file' => $cache_root.'/Cache-FastMmap', + 'init_file' => 1, + 'raw_values' => 1, + %cache_options, + ); +} + +my %caches; +my $count = -10; + +print '$cache->set($key, $value)'."\n"; +for my $cache (@caches) { + my $name = ref($cache); + $name = 'GitwebCache' if ($name =~ /^GitwebCache/); + $caches{$name} = sub { $cache->set($key, $value); }; +} + +my $result_set = timethese($count, { %caches }); +cmpthese($result_set); + +print "\n"; + +print '$cache->get($key)'."\n"; +for my $cache (@caches) { + my $name = ref($cache); + $name = 'GitwebCache' if ($name =~ /^GitwebCache/); + $caches{$name} = sub { $cache->get($key); }; +} + +my $result_get = timethese($count, { %caches }); +cmpthese($result_get); + +rmtree($cache_root); + +1; +__END__ +## EXAMPLE OUTPUT ## +# +# $cache->set($key, $value) +# Benchmark: running Cache::FastMmap, Cache::FileCache, Cache::MemoryCache, GitwebCache +# for at least 10 CPU seconds... +# Cache::FastMmap: 11 wallclock secs ( 8.46 usr + 2.17 sys = 10.63 CPU) @ 15710.25/s (n=167000) +# Cache::FileCache: 15 wallclock secs ( 8.43 usr + 2.25 sys = 10.68 CPU) @ 356.27/s (n=3805) +# Cache::MemoryCache: 13 wallclock secs ( 9.91 usr + 0.09 sys = 10.00 CPU) @ 3306.20/s (n=33062) +# GitwebCache: 29 wallclock secs ( 7.02 usr + 3.47 sys = 10.49 CPU) @ 605.91/s (n=6356) +# Rate Cache::FileCache GitwebCache Cache::MemoryCache Cache::FastMmap +# Cache::FileCache 356/s -- -41% -89% -98% +# GitwebCache 606/s 70% -- -82% -96% +# Cache::MemoryCache 3306/s 828% 446% -- -79% +# Cache::FastMmap 15710/s 4310% 2493% 375% -- +# +# $cache->get($key) +# Benchmark: running Cache::FastMmap, Cache::FileCache, Cache::MemoryCache, GitwebCache +# for at least 10 CPU seconds... +# Cache::FastMmap: 13 wallclock secs ( 7.32 usr + 2.83 sys = 10.15 CPU) @ 24260.59/s (n=246245) +# Cache::FileCache: 12 wallclock secs ( 9.22 usr + 1.30 sys = 10.52 CPU) @ 972.62/s (n=10232) +# Cache::MemoryCache: 14 wallclock secs ( 9.89 usr + 0.12 sys = 10.01 CPU) @ 3679.52/s (n=36832) +# GitwebCache: 20 wallclock secs ( 8.16 usr + 2.36 sys = 10.52 CPU) @ 4401.05/s (n=46299) +# Rate Cache::FileCache Cache::MemoryCache GitwebCache Cache::FastMmap +# Cache::FileCache 973/s -- -74% -78% -96% +# Cache::MemoryCache 3680/s 278% -- -16% -85% +# GitwebCache 4401/s 352% 20% -- -82% +# Cache::FastMmap 24261/s 2394% 559% 451% -- -- 1.7.0.1 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html