diff options
author | njn <njn@a5019735-40e9-0310-863c-91ae7b9d1cf9> | 2005-12-14 02:58:23 +0000 |
---|---|---|
committer | njn <njn@a5019735-40e9-0310-863c-91ae7b9d1cf9> | 2005-12-14 02:58:23 +0000 |
commit | 57781864ef4f03a1bcffb2c33b01e205c35bf5c9 (patch) | |
tree | b5b6c4cb5505dbe9010ef8c5c654e6aa77ce039f /perf | |
parent | b2b4f460196a9f093cccce177f17bc3ef2912b6f (diff) |
Add --vg option to vg_perf, which lets you specify one or more Valgrinds
to time, and presents their timings in an easy-to-compare way.
git-svn-id: svn://svn.valgrind.org/valgrind/trunk@5339 a5019735-40e9-0310-863c-91ae7b9d1cf9
Diffstat (limited to 'perf')
-rw-r--r-- | perf/vg_perf.in | 111 |
1 files changed, 63 insertions, 48 deletions
diff --git a/perf/vg_perf.in b/perf/vg_perf.in index 1473fe04..2e4b3520 100644 --- a/perf/vg_perf.in +++ b/perf/vg_perf.in @@ -27,12 +27,7 @@ # The GNU General Public License is contained in the file COPYING. #---------------------------------------------------------------------------- -# usage: vg_perf [options] <dirs | files> -# -# Options: -# --all: run tests in all subdirs -# --valgrind: valgrind to use (the directory it's in). Default is the one -# in the current tree. +# usage: see usage message. # # The easiest way is to run all tests in valgrind/ with (assuming you installed # in $PREFIX): @@ -69,7 +64,9 @@ usage: vg_perf [options] [files or dirs] -h --help show this message --all run all tests under this directory --reps number of repeats for each program [3] - + --vg Valgrind(s) to measure (can be specified multiple + times). The "in-place" build is used. + [Valgrind in the current directory] END ; @@ -89,8 +86,9 @@ my %toolnames = ( massif => "ms" ); -# We run each program this many times and choose the best time. -my $n_reps = 3; +# Command line options +my $n_reps = 3; # Run each program $n_reps times and choose the best one. +my @vgdirs; # Dirs of the various Valgrinds being measured. my $num_tests_done = 0; my $num_timings_done = 0; @@ -98,10 +96,6 @@ my $num_timings_done = 0; # Starting directory chomp(my $tests_dir = `pwd`); -# Directory of the Valgrind being measured. Default is the one in the -# current tree. -my $vg_dir = $tests_dir; - #---------------------------------------------------------------------------- # Process command line, setup #---------------------------------------------------------------------------- @@ -140,6 +134,14 @@ sub validate_tools($) return @t; } +sub add_vgdir($) +{ + my ($vgdir) = @_; + if ($vgdir !~ /^\//) { $vgdir = "$tests_dir/$vgdir"; } + validate_program($vgdir, "./coregrind/valgrind", 1, 1); + push(@vgdirs, $vgdir); +} + sub process_command_line() { my $alldirs = 0; @@ -149,10 +151,11 @@ sub process_command_line() if ($arg =~ /^-/) { if ($arg =~ /^--all$/) { $alldirs = 1; - } elsif ($arg =~ /^--valgrind=(.*)$/) { - $vg_dir = $1; } elsif ($arg =~ /^--reps=(\d+)$/) { $n_reps = $1; + } elsif ($arg =~ /^--vg=(.+)$/) { + # Make dir absolute if not already + add_vgdir($1); } else { die $usage; } @@ -160,9 +163,11 @@ sub process_command_line() push(@fs, $arg); } } - # Make $vg_dir absolute if not already - if ($vg_dir !~ /^\//) { $vg_dir = "$tests_dir/$vg_dir"; } - validate_program($vg_dir, "./coregrind/valgrind", 1, 1); + + # If no --vg options were specified, use the current tree. + if (0 == @vgdirs) { + add_vgdir($tests_dir); + } if ($alldirs) { @fs = (); @@ -243,8 +248,8 @@ sub time_prog($$) mysystem("echo '$cmd' > perf.cmd"); my $retval = mysystem("$cmd > perf.stdout 2> perf.stderr"); (0 == $retval) or - die "\n*** Command returned non-zero: $cmd" - . "\n*** See perf.{cmd,stdout,stderr} to diagnose what went wrong.\n"; + die "\n*** Command returned non-zero ($retval)" + . "\n*** See perf.{cmd,stdout,stderr} to determine what went wrong.\n"; my $out = `cat perf.stderr`; ($out =~ /usertime: ([\d\.]+)s/) or die "\n*** missing usertime in perf.stderr\n"; @@ -268,40 +273,50 @@ sub do_one_test($$) } } - printf("%-12s", "$name:"); - my $timecmd = "/usr/bin/time -f 'usertime: %Us'"; # Do the native run(s). - printf("nt:"); + printf("-- $name --\n") if (@vgdirs > 1); my $cmd = "$timecmd $prog $args"; my $tNative = time_prog($cmd, $n_reps); - printf("%4.1fs ", $tNative); - - foreach my $tool (@tools) { - (defined $toolnames{$tool}) or - die "unknown tool $tool, please add to %toolnames\n"; - - # Do the tool run(s). Set both VALGRIND_LIB and VALGRIND_LIB_INNER - # in case this Valgrind was configured with --enable-inner. - printf("%s:", $toolnames{$tool}); - my $vgsetup = "VALGRIND_LIB=$vg_dir/.in_place " - . "VALGRIND_LIB_INNER=$vg_dir/.in_place "; - my $vgcmd = "$vg_dir/coregrind/valgrind " - . "--command-line-only=yes --tool=$tool -q " - . "--memcheck:leak-check=no --addrcheck:leak-check=no " - . "$vgopts "; - my $cmd = "$vgsetup $timecmd $vgcmd $prog $args"; - my $tTool = time_prog($cmd, $n_reps); - printf("%4.1fs (%4.1fx) ", $tTool, $tTool/$tNative); - - $num_timings_done++; - } - printf("\n"); - if (defined $cleanup) { - (system("$cleanup") == 0) or - print(" ($name cleanup operation failed: $cleanup)\n"); + foreach my $vgdir (@vgdirs) { + # Benchmark name + printf("%-8s ", $name); + + # Print the Valgrind version if we are measuring more than one. + my $vgdirname = $vgdir; + chomp($vgdirname = `basename $vgdir`); + printf("%-10s:", $vgdirname); + + # Native execution time + printf("%4.1fs ", $tNative); + + foreach my $tool (@tools) { + (defined $toolnames{$tool}) or + die "unknown tool $tool, please add to %toolnames\n"; + + # Do the tool run(s). Set both VALGRIND_LIB and VALGRIND_LIB_INNER + # in case this Valgrind was configured with --enable-inner. + printf("%s:", $toolnames{$tool}); + my $vgsetup = "VALGRIND_LIB=$vgdir/.in_place " + . "VALGRIND_LIB_INNER=$vgdir/.in_place "; + my $vgcmd = "$vgdir/coregrind/valgrind " + . "--command-line-only=yes --tool=$tool -q " + . "--memcheck:leak-check=no --addrcheck:leak-check=no " + . "$vgopts "; + my $cmd = "$vgsetup $timecmd $vgcmd $prog $args"; + my $tTool = time_prog($cmd, $n_reps); + printf("%4.1fs (%4.1fx) ", $tTool, $tTool/$tNative); + + $num_timings_done++; + + if (defined $cleanup) { + (system("$cleanup") == 0) or + print(" ($name cleanup operation failed: $cleanup)\n"); + } + } + printf("\n"); } $num_tests_done++; |