git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCHv7 6/9] gitweb: gravatar url cache

From
Jakub Narebski <jnareb@gmail.com>
Date
Jun 27, 2009, 22:15 UTC
Message-ID
<200906280015.31639.jnareb@gmail.com>
In-Reply-To
<1246104305-15191-7-git-send-email-giuseppe.bilotta@gmail.com>
On Sat, 27 June 2009, Giuseppe Bilotta wrote:
Show 5 quoted lines
> 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).

Show 18 quoted lines
>  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.
Show 11 quoted lines
> +
> +# 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.
Show 12 quoted lines
> +
>  # 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.
Show 11 quoted lines
>  	# 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
Previous: Giuseppe BilottaNext: Jakub Narebski
Message 16 of 31 in “[PATCHv7 0/9] gitweb: avatar support”
  1. Giuseppe BilottaJun 27, 2009
  2. 1/9 gitweb: refactor author name insertionGiuseppe Bilotta, Jun 27, 2009
  3. 2/9 gitweb: uniform author info for commit and commitdiffGiuseppe Bilotta, Jun 27, 2009
  4. 3/9 gitweb: use git_print_authorship_rows in 'tag' view tooGiuseppe Bilotta, Jun 27, 2009
  5. 4/9 gitweb: right-align date cell in shortlogGiuseppe Bilotta, Jun 27, 2009
  6. 5/9 gitweb: (gr)avatar supportGiuseppe Bilotta, Jun 27, 2009
  7. 6/9 gitweb: gravatar url cacheGiuseppe Bilotta, Jun 27, 2009
  8. 7/9 gitweb: picon avatar providerGiuseppe Bilotta, Jun 27, 2009
  9. 8/9 gitweb: use picon for gravatar fallbackGiuseppe Bilotta, Jun 27, 2009
  10. 9/9 gitweb: add alt text to avatar imgGiuseppe Bilotta, Jun 27, 2009
  11. Jakub NarebskiJun 28, 2009
  12. Giuseppe BilottaJun 28, 2009
  13. Jakub NarebskiJun 28, 2009
  14. Jakub NarebskiJun 28, 2009
  15. Giuseppe BilottaJun 28, 2009
  16. Jakub NarebskiJun 27, 2009
  17. Jakub NarebskiJun 27, 2009
  18. Giuseppe BilottaJun 27, 2009
  19. Jakub NarebskiJun 27, 2009
  20. Jakub NarebskiJun 27, 2009
  21. Giuseppe BilottaJun 27, 2009
  22. Jakub NarebskiJun 27, 2009
  23. Giuseppe BilottaJun 27, 2009
  24. Jakub NarebskiJun 27, 2009
  25. Junio C HamanoJun 27, 2009
  26. Giuseppe BilottaJun 27, 2009
  27. Jakub NarebskiJun 27, 2009
  28. Giuseppe BilottaJun 27, 2009
  29. Giuseppe BilottaJun 27, 2009
  30. Jakub NarebskiJun 29, 2009
  31. Giuseppe BilottaJun 29, 2009

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.