Skip to content

Instantly share code, notes, and snippets.

@jnareb
Created July 27, 2010 01:59
Show Gist options
  • Save jnareb/491592 to your computer and use it in GitHub Desktop.
Save jnareb/491592 to your computer and use it in GitHub Desktop.
Benchmark for gitweb caching engine
#!/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;
sub add_cache {
my ($caches, $cache_key, $module, %extra_opts) = @_;
my $namespace = $module;
$namespace =~ s/::/-/g;
$caches->{$cache_key}{'module'} = $module;
$caches->{$cache_key}{'start'} = sub {
$module->new({
'namespace' => $namespace,
%cache_options,
%extra_opts,
});
};
my $cache = $caches->{$cache_key}{'cache'}
= $caches->{$cache_key}{'start'}->();
$caches->{$cache_key}{'set'} = sub {
$cache->set($key, $value);
};
$caches->{$cache_key}{'get'} = sub {
$cache->get($key);
};
$caches->{$cache_key}{'setup+set'} = sub {
$caches->{$cache_key}{'start'}->();
$caches->{$cache_key}{'set'}->();
};
$caches->{$cache_key}{'setup+get'} = sub {
$caches->{$cache_key}{'start'}->();
$caches->{$cache_key}{'get'}->();
};
}
add_cache(\%caches, 'SimpleFileCache', 'GitwebCache::SimpleFileCache');
# assume that all Cache::Cache modules are available if one of them is
if (eval { require Cache::FileCache; 1; }) {
add_cache(\%caches, 'C::FileCache', 'Cache::FileCache');
# for reference
require Cache::MemoryCache;
add_cache(\%caches, 'C::MemoryCache', 'Cache::MemoryCache');
require Cache::NullCache;
add_cache(\%caches, 'C::NullCache', 'Cache::NullCache');
}
if (eval { require Cache::FastMmap; 1 }) {
add_cache(\%caches, 'FastMmap', 'Cache::FastMmap',
'share_file' => $cache_root.'/Cache-FastMmap',
'init_file' => 1, # clear any exiting values and re-initialize file
'raw_values' => 1, # don't freeze/thaw (serialize) data
);
add_cache(\%caches, 'FastMmap (S)', 'Cache::FastMmap',
'share_file' => $cache_root.'/Cache-FastMmap',
'init_file' => 1, # clear any exiting values and re0initialize file
);
}
my %codehash;
my $count = -10;
my $result_set;
print '$cache->set($key, $value)'."\n";
%codehash = map { $_ => $caches{$_}{'set'} } keys %caches;
$result_set = timethese($count, \%codehash);
cmpthese($result_set);
print "\n";
print '$cache->get($key)'."\n";
%codehash = map { $_ => $caches{$_}{'get'} } keys %caches;
$result_set = timethese($count, \%codehash);
cmpthese($result_set);
print "\n";
## Cache::FastMmap shouldn't use "'init_file' => 1" for this
#
# print '$cache->new(...) + $cache->set($key, $value)'."\n";
# %codehash = map { $_ => $caches{$_}{'setup+set'} } keys %caches;
# $result_set = timethese($count, \%codehash);
# cmpthese($result_set);
# print "\n";
#
# print '$cache->new(...) + $cache->get($key)'."\n";
# %codehash = map { $_ => $caches{$_}{'setup+get'} } keys %caches;
# $result_set = timethese($count, \%codehash);
# cmpthese($result_set);
# print "\n";
rmtree($cache_root);
1;
__END__
## EXAMPLE OUTPUT ##
#
# Cache::FastMmap version 1.35
# Cache::Cache (Cache::FileCache, Cache::MemoryCache) version 1.05
#
# $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) # $key exists in cache
# 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% --
## EXAMPLE OUTPUT (new version of test, modified SimpleFileCache) ##
#
## like for non-persistent environment
#
# $cache->new(...) + $cache->set($key, $value)
# Benchmark: running C::FileCache, C::MemoryCache, C::NullCache, SimpleFileCache
# for at least 10 CPU seconds...
# Rate C::FileCache SimpleFileCache C::MemoryCache C::NullCache
# C::FileCache 271/s -- -47% -85% -99%
# SimpleFileCache 510/s 88% -- -71% -98%
# C::MemoryCache 1766/s 553% 246% -- -94%
# C::NullCache 29119/s 10660% 5612% 1549% --
#
# $cache->new(...) + $cache->get($key)
# Benchmark: running C::FileCache, C::MemoryCache, C::NullCache, SimpleFileCache
# for at least 10 CPU seconds...
# Rate C::FileCache C::MemoryCache SimpleFileCache C::NullCache
# C::FileCache 510/s -- -73% -82% -98%
# C::MemoryCache 1905/s 273% -- -32% -93%
# SimpleFileCache 2806/s 450% 47% -- -90%
# C::NullCache 28626/s 5509% 1402% 920% --
#
## like for persistent environment
#
# $cache->set($key, $value)
# Benchmark: running C::FileCache, C::MemoryCache, C::NullCache,
# FastMmap, FastMmap (S), SimpleFileCache for at least 10 CPU seconds...
# Rate C::FileCache SimpleFileCache C::MemoryCache FastMmap (S) FastMmap C::NullCache
# C::FileCache 309/s -- -46% -90% -94% -98% -100%
# SimpleFileCache 574/s 86% -- -82% -88% -96% -100%
# C::MemoryCache 3168/s 925% 451% -- -34% -78% -99%
# FastMmap (S) 4828/s 1462% 740% 52% -- -66% -99%
# FastMmap 14289/s 4524% 2387% 351% 196% -- -98%
# C::NullCache 572686/s 185208% 99586% 17976% 11761% 3908% --
#
# $cache->get($key) # $key exists in cache
# Benchmark: running C::FileCache, C::MemoryCache, C::NullCache,
# FastMmap, FastMmap (S), SimpleFileCache for at least 10 CPU seconds...
# Rate C::FileCache SimpleFileCache C::MemoryCache FastMmap (S) FastMmap C::NullCache
# C::FileCache 830/s -- -77% -79% -94% -96% -100%
# C::MemoryCache 3539/s 326% -- -12% -75% -84% -99%
# SimpleFileCache 4040/s 387% 14% -- -72% -82% -99%
# FastMmap (S) 14367/s 1631% 306% 256% -- -35% -97%
# FastMmap 22247/s 2580% 529% 451% 55% -- -96%
# C::NullCache 546698/s 65759% 15348% 13431% 3705% 2357% --
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment