Dan McGee <dpmcgee@xxxxxxxxx> writes: >>> unable to figure out how you generated those numbers so I wasn't able >>> to do so (and had planned to get back to you to find out how you made >>> those tables). Were you able to verify the ordering did not regress? >> >> No; I was hoping you would redo the benchmark using 5f44324 (core: log >> offset pack data accesses happened, 2011-07-06). > > I'm still not sure what you used to parse these results,... Ah, in the kernel repository, after running "repack -a -d -f" with versions of git and copying the resulting packfiles in PACK-OLD/ and PACK-NEW/, I used these scripts to examine the access pattern. -- >8 -- DOIT.sh -- >8 -- #!/bin/sh tmp=/var/tmp/ll$ trap 'rm -f "$tmp.*"' 0 ln -f PACK-OLD/* .git/objects/pack/. || exit log="$tmp.old" eval '/usr/bin/time rungit test -c core.logpackaccess="$log" '"$*" ln -f PACK-NEW/* .git/objects/pack/. || exit log="$tmp.new" eval '/usr/bin/time rungit test -c core.logpackaccess="$log" '"$*" perl OFS.perl "$tmp.old" "$tmp.new" -- 8< -- DOIT.sh -- 8< -- -- >8 -- OFS.perl -- >8 -- #!/usr/bin/perl use strict; use warnings; use Getopt::Long; my $verbose; exit(1) if (!GetOptions("verbose" => \$verbose)); sub take_one { my ($filename) = @_; my (%lofs, $num); my @diff; open my $in, '<', $filename; $num = 0; while (<$in>) { my ($file, $ofs) = split(' '); if (!exists $lofs{$file}) { $lofs{$file} = [$num++, 0]; } my $diff = $ofs - $lofs{$file}[1]; $lofs{$file}[1] = $ofs; push @diff, abs($diff); print "$lofs{$file}[0] $diff $ofs\n" if $verbose; } return \@diff; } sub bsearch { my ($list, $target) = @_; my ($hi, $lo) = ((scalar @$list), 0); while ($lo < $hi) { my $mi = int(($lo + $hi) / 2); if ($list->[$mi] == $target) { return $mi; } elsif ($list->[$mi] < $target) { $lo = $mi + 1; } else { $hi = $mi; } } return $hi; } my @percentile = (); for (my $i = 0; $i < 100; $i += 10) { push @percentile, $i; } push @percentile, 95, 99, 99.9, 99.99; sub thcomma { my ($intval) = @_; my $result = ""; while ($intval > 1000) { my $rem = $intval % 1000; if ($result ne "") { $result = sprintf "%03d,%s", $rem, $result; } else { $result = sprintf "%03d", $rem; } $intval -= $rem; $intval /= 1000; } if ($intval) { if ($result ne "") { $result = sprintf "%d,%s", $intval, $result; } else { $result = sprintf "%d", $intval; } } $result =~ s/^[0,]*//; $result = "0" if ($result eq ""); return $result; } sub show_stat { my ($diff1, $diff2) = @_; my ($i, $ix); if ($diff2) { @$diff2 = sort { $a <=> $b } @$diff2; } @$diff1 = sort { $a <=> $b } @$diff1; printf "\nTotal number of access : %12s", thcomma(scalar(@$diff1)); printf "%12s", thcomma(scalar(@$diff2)) if ($diff2); for $i (@percentile) { $ix = scalar(@$diff1) * $i / 100; printf "\n %5.2f%% percentile : %12s", $i, thcomma($diff1->[$ix]); if ($diff2) { $ix = scalar(@$diff2) * $i / 100; printf "%12s", thcomma($diff2->[$ix]); } } $ix = bsearch($diff1, 2 * 1024 * 1024); printf "\n Less than 2MiB seek : %5.2f%%", ($ix * 100.0 / @$diff1); if ($diff2) { $ix = bsearch($diff2, 2 * 1024 * 1024); printf " %5.2f%%", ($ix * 100.0 / @$diff2); } print "\n"; } my ($diff1, $diff2); $diff1 = take_one($ARGV[0]); $diff2 = take_one($ARGV[1]) if ($ARGV[1]); show_stat($diff1, $diff2); -- 8< -- OFS.perl -- 8< -- -- 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