git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Jakub Narebski <jnareb@gmail.com>
To: Giuseppe Bilotta <giuseppe.bilotta@gmail.com>
Cc: git@vger.kernel.org, Junio C Hamano <gitster@pobox.com>
Subject: Re: [PATCHv7 6/9] gitweb: gravatar url cache
Date: Sun, 28 Jun 2009 00:15:30 +0200	[thread overview]
Message-ID: <200906280015.31639.jnareb@gmail.com> (raw)
In-Reply-To: <1246104305-15191-7-git-send-email-giuseppe.bilotta@gmail.com>

On Sat, 27 June 2009, Giuseppe Bilotta wrote:

> Views which contain many occurrences of the same email address (e.g.
> shortlog view) benefit from not having to recalculate the MD5 of the
> email address every time.
> 
> Signed-off-by: Giuseppe Bilotta <giuseppe.bilotta@gmail.com>

Acked-by: Jakub Narebski <jnareb@gmail.com>

> ---

Here there are some very simple benchmarks of the effect of gravatar 
URL cache.  I'm not sure if they should be put in commit message.

When running gitweb as a script
   $ time gitweb-run.sh "p=git.git;a=shortlog" >/dev/null
I got the following results

             | before          | after 
 ------------+-----------------|------------------
 summary     | 0.978s (0.964s) | 0.961s (0.940s)
 shortlog    | 1.001s (0.980s) | 1.033s (1.008s)

which means the same results within the margin of error, (as seen when
repeating benchmark the differences are within the range of fluctuations).
Time is real (wallclock) time, in parentheses there is user + sys time.


When using ApacheBench 2.0.41-dev, with gitweb run as CGI script
(not as legacy, i.e. ModPerl::Registry, mod_perl script)
  $ ab <opt> "http://localhost/cgi-bin/gitweb/gitweb.cgi/git.git/shortlog"
I got the folowing results

             | before          | after 
 ------------+-----------------|------------------
 -n 10       | 1094.050 [ms]   |  989.136 [ms]
 -n 10 -c 2  | 1147.965 [ms]   | 1041.324 [ms]

which means around 10% improvement.  Standard deviation is around 10 ms
for no concurrency, and around 200 ms (more than third of difference)
for concurrent connections.  Shown here is time per request (mean, 
across all concurrent requests).

>  gitweb/gitweb.perl |   30 +++++++++++++++++++++++++++---
>  1 files changed, 27 insertions(+), 3 deletions(-)
> 
> diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl
> index ad9ae31..de4cc63 100755
> --- a/gitweb/gitweb.perl
> +++ b/gitweb/gitweb.perl
> @@ -1515,6 +1515,27 @@ sub format_subject_html {
>  	}
>  }
>  
> +# Rather than recomputing the url for an email multiple times, we cache it
> +# after the first hit. This gives a visible benefit in views where the avatar
> +# for the same email is used repeatedly (e.g. shortlog).
> +# The cache is shared by all avatar engines (currently gravatar only), which
> +# are free to use it as preferred. Since only one avatar engine is used for any
> +# given page, there's no risk for cache conflicts.
> +our %avatar_cache = ();

Good comment.

> +
> +# Compute the gravatar url for a given email, if it's not in the cache already.
> +# Gravatar stores only the part of the URL before the size, since that's the
> +# one computationally more expensive. This also allows reuse of the cache for
> +# different sizes (for this particular engine).
> +sub gravatar_url {
> +	my $email = lc shift;
> +	my $size = shift;
> +	$avatar_cache{$email} ||=
> +		"http://www.gravatar.com/avatar.php?gravatar_id=" .
> +			Digest::MD5::md5_hex($email) . "&amp;size=";

The same comment as for previous patch: why not use modern API?

  +		"http://www.gravatar.com/avatar/" .
  +			Digest::MD5::md5_hex($email) . "?size=";


> +	return $avatar_cache{$email} . $size;
> +}

Nice.

> +
>  # Insert an avatar for the given $email at the given $size if the feature
>  # is enabled.
>  sub git_get_avatar {
> @@ -1524,15 +1545,18 @@ sub git_get_avatar {
>  	my $size = $avatar_size{$opts{'size'}} || $avatar_size{'default'};
>  	my $url = "";
>  	if ($git_avatar eq 'gravatar') {
> -		$url = "http://www.gravatar.com/avatar.php?gravatar_id=" .
> -			Digest::MD5::md5_hex(lc $email) . "&amp;size=$size";
> +		$url = gravatar_url($email, $size);
>  	}

Great encapsulation.

>  	# Currently only gravatars are supported, but other forms such as
>  	# picons can be added by putting an else up here and defining $url
>  	# as needed. If no variant puts something in $url, we assume avatars
>  	# are completely disabled/unavailable.
>  	if ($url) {
> -		return $pre_white . "<img width=\"$size\" class=\"avatar\" src=\"$url\" />" . $post_white;
> +		return $pre_white .
> +		       "<img width=\"$size\" " .
> +		            "class=\"avatar\" " .
> +		            "src=\"$url\" " .
> +		       "/>" . $post_white;

This is independent change.  It shouldn't be here; if you prefer such 
solution, you should squash it with previous patch.  Please drop this
chunk.

>  	} else {
>  		return "";
>  	}
> -- 

Thanks again for great work on this series!

-- 
Jakub Narebski
Poland

  parent reply	other threads:[~2009-06-27 22:15 UTC|newest]

Thread overview: 31+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-06-27 12:04 [PATCHv7 0/9] gitweb: avatar support Giuseppe Bilotta
2009-06-27 12:04 ` [PATCHv7 1/9] gitweb: refactor author name insertion Giuseppe Bilotta
2009-06-27 12:04   ` [PATCHv7 2/9] gitweb: uniform author info for commit and commitdiff Giuseppe Bilotta
2009-06-27 12:04     ` [PATCHv7 3/9] gitweb: use git_print_authorship_rows in 'tag' view too Giuseppe Bilotta
2009-06-27 12:05       ` [PATCHv7 4/9] gitweb: right-align date cell in shortlog Giuseppe Bilotta
2009-06-27 12:05         ` [PATCHv7 5/9] gitweb: (gr)avatar support Giuseppe Bilotta
2009-06-27 12:05           ` [PATCHv7 6/9] gitweb: gravatar url cache Giuseppe Bilotta
2009-06-27 12:05             ` [PATCHv7 7/9] gitweb: picon avatar provider Giuseppe Bilotta
2009-06-27 12:05               ` [PATCHv7 8/9] gitweb: use picon for gravatar fallback Giuseppe Bilotta
2009-06-27 12:05                 ` [PATCHv7 9/9] gitweb: add alt text to avatar img Giuseppe Bilotta
2009-06-28 15:43                   ` Jakub Narebski
2009-06-28 16:10                     ` Giuseppe Bilotta
2009-06-28 14:42                 ` [PATCHv7 8/9] gitweb: use picon for gravatar fallback Jakub Narebski
2009-06-28 11:35               ` [PATCHv7 7/9] gitweb: picon avatar provider Jakub Narebski
2009-06-28 16:03                 ` Giuseppe Bilotta
2009-06-27 22:15             ` Jakub Narebski [this message]
2009-06-27 19:45           ` [PATCHv7 5/9] gitweb: (gr)avatar support Jakub Narebski
2009-06-27 22:45             ` Giuseppe Bilotta
2009-06-27 23:20               ` Jakub Narebski
2009-06-27 18:28         ` [PATCHv7 4/9] gitweb: right-align date cell in shortlog Jakub Narebski
2009-06-27 22:27           ` Giuseppe Bilotta
2009-06-27 18:10       ` [PATCHv7 3/9] gitweb: use git_print_authorship_rows in 'tag' view too Jakub Narebski
2009-06-27 22:24         ` Giuseppe Bilotta
2009-06-27 16:10     ` [PATCHv7 2/9] gitweb: uniform author info for commit and commitdiff Jakub Narebski
2009-06-27 18:38       ` Junio C Hamano
2009-06-27 22:33         ` Giuseppe Bilotta
2009-06-27 14:24   ` [PATCHv7 1/9] gitweb: refactor author name insertion Jakub Narebski
2009-06-27 15:26     ` Giuseppe Bilotta
2009-06-27 15:48       ` Giuseppe Bilotta
2009-06-29 21:37 ` [PATCHv7 0/9] gitweb: avatar support Jakub Narebski
2009-06-29 21:55   ` Giuseppe Bilotta

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=200906280015.31639.jnareb@gmail.com \
    --to=jnareb@gmail.com \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=giuseppe.bilotta@gmail.com \
    /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).