X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/5b421a4e8ef66052fd5aa72add2030da679d220e..cac9e09bbf68269173df301cd06ad40b904d11ec:/etc/bench.pl.in diff --git a/etc/bench.pl.in b/etc/bench.pl.in index 481f3dda..d1b2aa44 100755 --- a/etc/bench.pl.in +++ b/etc/bench.pl.in @@ -29,19 +29,49 @@ bench.pl - perform benches on Bison parsers. =over 4 +=item B<-b>, B<--bench>=I + +Specify the set of benches to run. I should be one of: + +=over 4 + +=item I + +Test F with three stacks against F which +uses a single one. + +=item I + +Test the push parser vs. the pull interface. Use the C parser. + +=item I + +Test the use of variants instead of union in the C++ parser. + +=back + =item B<-c>, B<--cflags>=I -Flags to pass to the C or C++ compiler. +Flags to pass to the C or C++ compiler. Defaults to -O2. + +=item B<-h>, B<--help> + +Display this message and exit succesfully. The more verbose, the more +details. =item B<-i>, B<--iterations>=I Say how many times a single test of the bench must be run. If negative, specify the minimum number of CPU seconds to run. Defaults -to -3. +to -1. + +=item B<-q>, B<--quiet> + +Decrease the verbosity level (defaults to 1). =item B<-v>, B<--verbose> -Raise the verbosity level. Currently only affects B<--help>. +Raise the verbosity level (defaults to 1). =back @@ -86,9 +116,9 @@ Verbosity level. my $bison = $ENV{'BISON'} || '@abs_top_builddir@/tests/bison'; my $cc = $ENV{'CC'} || 'gcc'; my $cxx = $ENV{'CXX'} || 'g++'; -my $cflags = ''; -my $iterations = -3; -my $verbose = 0; +my $cflags = '-O2'; +my $iterations = -1; +my $verbose = 1; =head1 FUNCTIONS @@ -590,12 +620,12 @@ yylex(yy::parser::semantic_type* yylval) return yy::parser::token::END_OF_FILE; else if (stage % 2) { - IF_VARIANTS(*yylval, yylval->ival) = stage; + IF_VARIANTS(yylval->build(), yylval->ival) = stage; return yy::parser::token::NUMBER; } else { - IF_VARIANTS(*yylval =, yylval->sval = new) std::string("A string."); + IF_VARIANTS(yylval->build() =, yylval->sval = new) std::string("A string."); return yy::parser::token::TEXT; } abort(); @@ -669,7 +699,7 @@ sub bench_grammar ($%) my %size; while (my ($name, $directives) = each %test) { - verbose 1, "Generating $name\n"; + verbose 2, "Generating $name\n"; # Call the Bison input file generator. my $generator = "$gram" . "_grammar"; &$generator ($name, 200, @$directives); @@ -688,17 +718,25 @@ sub bench_grammar ($%) # shows only wallclock and the two children times. 'auto' (the # default) will act as 'all' unless the children times are both # zero, in which case it acts as 'noc'. 'none' prevents output. - verbose 1, "Running the benches for $gram\n"; + verbose 2, "Running the benches for $gram\n"; my $res = timethese ($iterations, \%bench, 'nop'); # Output the speed result. cmpthese ($res, 'nop'); # Display the sizes. - print "Sizes:\n"; + print "Sizes (decreasing):\n"; + my $width = 10; for my $bench (keys %size) { - printf "%10s: %10dkB\n", $bench, int ($size{$bench} / 1024); + $width = length $bench + if $width < length $bench; + } + # Benches sorted by decreasing size. + my @benches_per_size = sort {$size{$b} <=> $size{$a}} keys %size; + for my $bench (@benches_per_size) + { + printf "%${width}s: %5.2fkB\n", $bench, $size{$bench} / 1024; } } @@ -735,10 +773,29 @@ sub bench_variant_parser () bench_grammar ('variant', ( - "union" => [], - "variant" => ['%variant'], - "union-debug" => ['%debug'], - "variant-debug" => ['%debug', '%variant'], + "f-union" => ['%skeleton "lalr1-fusion.cc"'], + "f-uni-deb" => ['%skeleton "lalr1-fusion.cc"', '%debug'], + "f-var" => ['%skeleton "lalr1-fusion.cc"', '%variant'], + "f-var-deb" => ['%skeleton "lalr1-fusion.cc"', '%debug', '%variant'], + "f-var-dtr" => ['%skeleton "lalr1-fusion.cc"', '%variant', "%code {\n#define VARIANT_DESTROY\n}"], + "f-var-deb-dtr" => ['%skeleton "lalr1-fusion.cc"', '%debug', '%variant', "%code {\n#define VARIANT_DESTROY\n}"], + ) + ); +} + +=item C + +Bench the C++ lalr1.cc parser using Boost.Variants or %union. + +=cut + +sub bench_fusion_parser () +{ + bench_grammar + ('variant', + ( + "split" => [], + "fused" => ['%skeleton "lalr1-fusion.cc"'], ) ); } @@ -759,10 +816,14 @@ sub help ($) sub getopt () { use Getopt::Long; - %option = ("h|help" => sub { help ($verbose) }, - "v|verbose" => sub { ++$verbose }, - "c|cflags=s" => \$cflags, - "i|iterations=i" => \$iterations); + %option = ( + "b|bench=s" => \$bench, + "c|cflags=s" => \$cflags, + "h|help" => sub { help ($verbose) }, + "i|iterations=i" => \$iterations, + "q|quiet" => sub { --$verbose }, + "v|verbose" => sub { ++$verbose }, + ); Getopt::Long::Configure ("bundling", "pass_through"); GetOptions (%option) or exit 1; @@ -775,8 +836,10 @@ verbose 1, "Using bison=$bison.\n"; verbose 1, "Using cc=$cc.\n"; verbose 1, "Using cxx=$cxx.\n"; verbose 1, "Using cflags=$cflags.\n"; -# bench_push_parser(); -bench_variant_parser(); + +bench_fusion_parser() if $bench eq "fusion"; +bench_push_parser() if $bench eq "push"; +bench_variant_parser() if $bench eq "variant"; ### Setup "GNU" style for perl-mode and cperl-mode. ## Local Variables: