From: Jakub Narebski <jnareb@gmail.com>
To: git@vger.kernel.org
Cc: John 'Warthog9' Hawley <warthog9@kernel.org>,
Petr Baudis <pasky@ucw.cz>,
admin@repo.or.cz, Jakub Narebski <jnareb@gmail.com>
Subject: [PoC PATCHv5 20/17] gitweb/lib - Benchmarking GitwebCache::SimpleFileCache (in t/9603/)
Date: Thu, 7 Oct 2010 00:02:05 +0200 [thread overview]
Message-ID: <1286402526-13143-21-git-send-email-jnareb@gmail.com> (raw)
In-Reply-To: <1286402526-13143-1-git-send-email-jnareb@gmail.com>
Add t/t9503/benchmark_caching_interface.pl, which benchmarks 'set' and
'get' methods from GitwebCache::SimpleFileCache, and compares them
against Cache::FileCache, Cache::MemoryCache, and Cache::FastMmap
if they are available.
Includes example benchmark results.
Signed-off-by: Jakub Narebski <jnareb@gmail.com>
---
Formerly as patch 06/17 in previous version of series, now marked PoC
("proof of concept"), and moved to the end of series.
Differences from v4:
* Make benchmark as if for persistent (get/set only) and
non-persistent (setup+get/set) environment.
* Add benchmark for Cache::NullCache (from Cache::Cache distribution)
as a kind of baseline.
* Do tests for Cache::FastMmap both with and without setting
raw_values.
* Include versions of modules used in benchmarks, and add new sample
benchmark results.
t/t9503/benchmark_caching_interface.pl | 209 ++++++++++++++++++++++++++++++++
1 files changed, 209 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..db06f6e
--- /dev/null
+++ b/t/t9503/benchmark_caching_interface.pl
@@ -0,0 +1,209 @@
+#!/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% --
--
1.7.3
next prev parent reply other threads:[~2010-10-06 22:04 UTC|newest]
Thread overview: 41+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-10-06 22:01 [PATCHv5 00/17] gitweb: Simple file based output caching Jakub Narebski
2010-10-06 22:01 ` [PATCHv5 01/17] t/test-lib.sh: Export also GIT_BUILD_DIR in test_external Jakub Narebski
2010-10-06 22:01 ` [PATCHv5 02/17] gitweb: Prepare for splitting gitweb Jakub Narebski
2010-10-06 22:01 ` [PATCHv5 03/17] gitweb/lib - Very simple file based cache Jakub Narebski
2010-10-06 22:41 ` Thomas Adam
2010-10-06 22:44 ` Ævar Arnfjörð Bjarmason
2010-10-06 22:46 ` Thomas Adam
2010-10-06 22:47 ` Ævar Arnfjörð Bjarmason
2010-10-06 23:00 ` Jakub Narebski
2010-10-06 23:12 ` Thomas Adam
2010-10-06 23:32 ` Jakub Narebski
2010-10-06 22:57 ` Ævar Arnfjörð Bjarmason
2010-10-06 23:46 ` Jakub Narebski
2010-10-06 22:01 ` [PATCHv5 04/17] gitweb/lib - Stat-based cache expiration Jakub Narebski
2010-10-06 22:01 ` [PATCHv5 05/17] gitweb/lib - Regenerate entry if the cache file has size of 0 Jakub Narebski
2010-10-06 22:01 ` [PATCHv5 06/17] gitweb/lib - Simple select(FH) based output capture Jakub Narebski
2010-10-06 22:52 ` Thomas Adam
2010-10-06 23:22 ` Jakub Narebski
2010-10-06 23:03 ` Ævar Arnfjörð Bjarmason
2010-10-06 23:26 ` Jakub Narebski
2010-10-06 22:01 ` [PATCHv5 07/17] gitweb/lib - Cache captured output (using get/set) Jakub Narebski
2010-10-06 22:01 ` [PATCHv5 08/17] gitweb: Add optional output caching Jakub Narebski
2010-10-06 22:46 ` Ævar Arnfjörð Bjarmason
2010-10-06 23:06 ` Jakub Narebski
2010-10-06 23:16 ` Ævar Arnfjörð Bjarmason
2010-10-06 22:01 ` [PATCHv5 09/17] gitweb/lib - Adaptive cache expiration time Jakub Narebski
2010-10-06 22:01 ` [PATCHv5 10/21] gitweb/lib - Use CHI compatibile (compute method) caching interface Jakub Narebski
2010-10-06 22:01 ` [PATCHv5 11/17] gitweb/lib - Use locking to avoid 'cache miss stampede' problem Jakub Narebski
2010-10-06 22:01 ` [PATCHv5 12/17] gitweb/lib - No need for File::Temp when locking Jakub Narebski
2010-10-06 22:01 ` [PATCHv5 13/17] gitweb/lib - Serve stale data when waiting for filling cache Jakub Narebski
2010-10-06 22:01 ` [PATCHv5 14/17] gitweb/lib - Regenerate (refresh) cache in background Jakub Narebski
2010-10-06 22:02 ` [PATCHv5 15/17] gitweb: Introduce %actions_info, gathering information about actions Jakub Narebski
2010-10-06 22:02 ` [PATCHv5/RFC 16/17] gitweb: Show appropriate "Generating..." page when regenerating cache Jakub Narebski
2010-10-06 22:02 ` [PATCHv5/RFC 17/17] gitweb: Add startup delay to activity indicator for cache Jakub Narebski
2010-10-06 22:02 ` [RFC/PATCHv5 18/17] gitweb/lib - Add clear() and size() methods to caching interface Jakub Narebski
2010-10-06 22:56 ` Thomas Adam
2010-10-06 22:02 ` [RFC PATCHv5 19/17] gitweb: Add beginnings of cache administration page Jakub Narebski
2010-10-06 22:02 ` Jakub Narebski [this message]
2010-10-06 22:02 ` [PoC PATCHv5 21/17] gitweb/lib - Alternate ways of capturing output Jakub Narebski
2010-10-10 20:32 ` [RFD] Possible improvements for output caching in gitweb Jakub Narebski
2010-10-24 21:34 ` [PATCHv5 00/17] gitweb: Simple file based output caching J.H.
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1286402526-13143-21-git-send-email-jnareb@gmail.com \
--to=jnareb@gmail.com \
--cc=admin@repo.or.cz \
--cc=git@vger.kernel.org \
--cc=pasky@ucw.cz \
--cc=warthog9@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).