This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
docs: clarify effect of $^H, %^H, ${^WARNING_BITS}
[perl5.git] / t / porting / bench.t
1 #!/usr/bin/perl
2
3 # Check the functionality of the Porting/bench.pl executable;
4 # in particular, its argument handling and its ability to produce
5 # the expected output for particular arguments.
6 #
7 # See also t/porting/bench_selftest.pl
8
9 BEGIN {
10     chdir '..' if -f 'test.pl';
11     @INC = ( './lib' );
12     require './t/test.pl';
13 }
14
15 use warnings;
16 use strict;
17 use Config;
18
19
20 # Only test on git checkouts - this is more of a perl core developer
21 # tool than an end-user tool.
22 # Only test on a platform likely to support forking, pipes, cachegrind
23 # etc.  Add other platforms if you think they're safe.
24
25 skip_all "not devel"   unless -d "./.git";
26 skip_all "not linux"   unless $^O eq 'linux';
27 skip_all "no valgrind" unless -x '/bin/valgrind' || -x '/usr/bin/valgrind';
28 # Address sanitizer clashes horribly with cachegrind
29 skip_all "not with ASAN" if $Config{ccflags} =~ /sanitize=address/;
30 skip_all "cachegrind broken" if system "( ulimit -c 0; valgrind -q --tool=cachegrind --cachegrind-out-file=/dev/null $^X -e0 ) 2>/dev/null";
31
32
33 my $bench_pl = "Porting/bench.pl";
34
35 ok -e $bench_pl, "$bench_pl exists and is executable";
36
37 my $bench_cmd = "$^X -Ilib $bench_pl";
38
39 my ($out, $cmd);
40
41 # Read in the expected output format templates and create qr//s from them.
42
43 my %formats;
44 my %format_qrs;
45
46 {
47     my $cur;
48     while (<DATA>) {
49         next if /^#/;
50         if (/^FORMAT:/) {
51             die "invalid format line: $_" unless /^FORMAT:\s+(\w+)\s*$/;
52             $cur = $1;
53             die "duplicate format: '$cur'\n" if exists $formats{$cur};
54             next;
55         }
56         $formats{$cur} .= $_;
57     }
58
59     for my $name (sort keys %formats) {
60         my $f = $formats{$name};
61
62         # expand "%%SUB_FORMAT%%
63         $f =~ s{^ \s* %% (\w+) %% [ \t]* \n}
64                {
65                     my $f1 = $formats{$1};
66                     die "No such sub-format '%%$1%%' in format '$name'\n"
67                         unless defined $f1;
68                     $f1;
69                }gmxe;
70
71         $f = quotemeta $f;
72
73         # convert NNNN.NN placeholders into a regex
74         $f =~ s{(N+)\\.(N+)}
75                {
76                     my $l = length($2);
77                     "("
78                     . "\\s*-?\\d+\\."
79                     . "\\d" x $l
80                     ."|\\s*-)"
81                }ge;
82
83         # convert run of space chars into ' +' or ' *'
84
85         $f =~ s/(\A|\n)(\\ )+/$1 */g;
86         $f =~ s/(\\ )+/ +/g;
87
88         # convert '---' placeholders into a regex
89         $f =~ s/(\\-){2,}/-+/g;
90
91         $format_qrs{$name} = qr/\A$f\z/;
92     }
93 }
94
95
96 # ---------------------------------------------------
97 # check croaks
98
99 for my $test (
100     [
101         "--boz",
102         "Unknown option: boz\nUse the -h option for usage information.\n",
103         "croak: basic unknown option"
104     ],
105     [
106         "--fields=Ir,Boz",
107         "Error: --fields: unknown field 'Boz'\n",
108         "croak: unknown --field"
109     ],
110     [
111         "--action=boz",
112         "Error: unrecognised action 'boz'\nmust be one of: grind, selftest\n",
113         "croak: unknown --action"
114     ],
115     [
116         "--sort=boz",
117         "Error: --sort argument should be of the form field:perl: 'boz'\n",
118         "croak: invalid --sort"
119     ],
120     [
121         "--sort=boz:perl",
122         "Error: --sort: unknown field 'boz'\n",
123         "croak: unknown --sort field"
124     ],
125     [
126         "-action=selftest perl",
127         "Error: no perl executables may be specified with selftest\n",
128         "croak: --action-selftest with executable"
129     ],
130     [
131         "--tests=/boz perl",
132         "Error: --tests regex must be of the form /.../\n",
133         "croak: invalid --tests regex"
134     ],
135     [
136         "--tests=call::sub::empty,foo::bar::baz::boz perl",
137           "Error: no such test found: 'foo::bar::baz::boz'\n"
138         . "Re-run with --verbose for a list of valid tests.\n",
139         "croak: unknown test in --tests"
140     ],
141     [
142         "--verbose --tests=call::sub::empty,foo::bar::baz::boz --read=t/porting/bench/callsub.json",
143             "Error: no such test found: 'foo::bar::baz::boz'\n"
144           . "Valid test names are:\n"
145           . "  call::sub::amp_empty\n"
146           . "  call::sub::empty\n",
147         "croak: unknown test in --tests --verbose"
148     ],
149     [
150         "--tests=/foo::bar::baz::boz/ perl",
151         "Error: no tests to run\n",
152         "croak: no --tests to run "
153     ],
154     [
155         "--benchfile=no-such-file-boz perl",
156         qr/\AError: can't read 'no-such-file-boz':/,
157         "croak: non-existent --benchfile "
158     ],
159     [
160         "--benchfile=t/porting/bench/synerr perl",
161         qr{\AError: can't parse 't/porting/bench/synerr':\nsyntax error},
162         "croak: --benchfile with syntax error"
163     ],
164     [
165         "--benchfile=t/porting/bench/ret0 perl",
166         "Error: can't load 't/porting/bench/ret0': code didn't return a true value\n",
167         "croak: --benchfile which returns 0"
168     ],
169     [
170         "--benchfile=t/porting/bench/oddentry perl",
171         qr{\AError: 't/porting/bench/oddentry' does not contain evenly paired test names and hashes\n},
172         "croak: --benchfile with odd number of entries"
173     ],
174     [
175         "--benchfile=t/porting/bench/badname perl",
176         qr{\AError: 't/porting/bench/badname': invalid test name: '1='\n},
177         "croak: --benchfile with invalid test name"
178     ],
179     [
180         "--benchfile=t/porting/bench/badhash perl",
181         qr{\AError: 't/porting/bench/badhash': invalid key 'blah' for test 'foo::bar'\n},
182         "croak: --benchfile with invalid test hash key"
183     ],
184     [
185         "--norm=2 ./miniperl ./perl",
186         "Error: --norm value 2 outside range 0..1\n",
187         "croak: select-a-perl out of range"
188     ],
189     [
190         "--norm=-0 ./miniperl ./perl",
191         "Error: --norm value -0 outside range -1..-2\n",
192         "croak: select-a-perl out of range"
193     ],
194     [
195         "--norm=-3 ./miniperl ./perl",
196         "Error: --norm value -3 outside range -1..-2\n",
197         "croak: select-a-perl out of range"
198     ],
199     [
200         "--sort=Ir:myperl ./miniperl ./perl",
201         "Error: --sort: unrecognised perl 'myperl'\n"
202         . "Valid perl names are:\n"
203         . "    ./miniperl\n"
204         . "    ./perl\n",
205         "croak: select-a-perl unrecognised"
206     ],
207     [
208         "--compact=./perl ./perl=A ./perl=B",
209         "Error: --compact: ambiguous perl './perl'\n",
210         "croak: select-a-perl ambiguous"
211     ],
212     [
213         "./perl --foo",
214         "Error: unrecognised executable switch '--foo'\n",
215         "croak: ./perl --foo"
216     ],
217     [
218         "-- --args=foo",
219         "Error: --args without a preceding executable name\n",
220         "croak: --args without perl"
221     ],
222     [
223         "-- --env=foo=bar",
224         "Error: --env without a preceding executable name\n",
225         "croak: --env without perl"
226     ],
227     [
228         "./perl --args",
229         "Error: --args is missing value\n",
230         "croak: --args without value"
231     ],
232     [
233         "./perl --env",
234         "Error: --env is missing value\n",
235         "croak: --env without value"
236     ],
237     [
238         "./perl --env='FOO'",
239         "Error: --env is missing =value\n",
240         "croak: --env without =value"
241     ],
242     [
243         "./perl ./perl",
244         "Error: duplicate label './perl': each executable must have a unique label\n",
245         "croak: duplicate label ./perl ./perl"
246     ],
247     [
248         "./perl=A ./miniperl=A",
249         "Error: duplicate label 'A': each executable must have a unique label\n",
250         "croak: duplicate label =A =A"
251     ],
252     [
253         "--read=t/porting/bench/callsub.json --read=t/porting/bench/callsub.json",
254         "Error: duplicate label './perl': seen in file 't/porting/bench/callsub.json'\n",
255         "croak: duplicate label --read=... --read=..."
256     ],
257     [
258         "--read=t/porting/bench/callsub.json ./perl",
259         "Error: duplicate label './perl': seen both in --read file and on command line\n",
260         "croak: duplicate label --read=... ./perl"
261     ],
262     [
263         "./nosuch-perl",
264         qr{^\QError: unable to execute './nosuch-perl': },
265         "croak:  no such perl"
266     ],
267     [
268         "--grindargs=Boz --debug --tests=call::sub::empty ./perl=A ./perl=B",
269         qr{Error: .*?(unexpected code or cachegrind output|gave return status)}s,
270         "croak: cachegrind output format "
271     ],
272     [
273         "--bisect=Ir",,
274         "Error: --bisect option must be of form 'field,integer,integer'\n",
275         "croak: --bisect=Ir"
276     ],
277     [
278         "--bisect=Ir,1",,
279         "Error: --bisect option must be of form 'field,integer,integer'\n",
280         "croak: --bisect=Ir,1"
281     ],
282     [
283         "--bisect=Ir,1,2,3",
284         "Error: --bisect option must be of form 'field,integer,integer'\n",
285         "croak: --bisect=Ir,1,2,3"
286     ],
287     [
288         "--bisect=Ir,1,x",
289         "Error: --bisect option must be of form 'field,integer,integer'\n",
290         "croak: --bisect=Ir,1,x"
291     ],
292     [
293         "--bisect=Ir,x,2",
294         "Error: --bisect option must be of form 'field,integer,integer'\n",
295         "croak: --bisect=Ir,x,2"
296     ],
297     [
298         "--bisect=boz,1,2",
299         "Error: unrecognised field 'boz' in --bisect option\n",
300         "croak: --bisect=boz,1,2"
301     ],
302     [
303         "--bisect=Ir,2,1",
304         "Error: --bisect min (2) must be <= max (1)\n",
305         "croak: --bisect=boz,2,1"
306     ],
307     [
308         "--read=no-such-file-boz",
309         qr/\AError: can't open 'no-such-file-boz' for reading:/,
310         "croak: non-existent --read file "
311     ],
312     [
313         "--read=t/porting/bench/badversion.json",
314         "Error: unsupported version 9999.9 in file 't/porting/bench/badversion.json' (too new)\n",
315         "croak: --read version"
316     ],
317     [
318         "--read=t/porting/bench/callsub.json --benchfile=t/perf/benchmarks ./perl ",
319         "Error: --benchfile cannot be used when --read is present\n",
320         "croak: benchfile with read"
321     ],
322     [
323         "",
324         "Error: nothing to do: no perls to run, no data to read.\n",
325         "croak: no input"
326     ],
327     [
328         "./perl",
329         "Error: need at least 2 perls for comparison.\n",
330         "croak: need 2 perls"
331     ],
332     [
333         "--bisect=Ir,1,2 ./perl=A ./perl=B",
334         "Error: exactly one perl executable must be specified for bisect\n",
335         "croak: --bisect, need 1 perls"
336     ],
337     [
338         "--bisect=Ir,1,2 --tests=/call/ ./perl=A",
339         "Error: only a single test may be specified with --bisect\n",
340         "croak: --bisect one test only"
341     ],
342     # note that callsub.json was created using
343     # ./perl -Ilib Porting/bench.pl --tests='/call::sub::(amp_)?empty/' \
344     #                     --write=t/porting/bench/callsub.json ./perl
345     [
346         "--read=t/porting/bench/callsub.json --write=no/such/file/boz",
347         qr{\AError: can't open 'no/such/file/boz' for writing: },
348         "croak: --write open error"
349     ],
350     # note that callsub2.json was created using
351     # ./perl -Ilib Porting/bench.pl \
352     #    --tests='call::sub::empty,call::sub::args3' \
353     #                     --write=t/porting/bench/callsub2.json ./perl=perl2
354     [
355            "--read=t/porting/bench/callsub.json "
356         . " --read=t/porting/bench/callsub2.json",
357         "Can't merge multiple read files: they contain differing test sets.\n"
358         . "Re-run with --verbose to see the differences.\n",
359         "croak: --read callsub, callsub2"
360     ],
361     [
362            "--read=t/porting/bench/callsub.json "
363         . " --read=t/porting/bench/callsub2.json"
364         . " --verbose",
365         "Can't merge multiple read files: they contain differing test sets.\n"
366         . "Previous tests:\n"
367         . "  call::sub::amp_empty\n"
368         . "  call::sub::empty\n"
369         . "tests from 't/porting/bench/callsub2.json':\n"
370         . "  call::sub::args3\n"
371         . "  call::sub::empty\n",
372         "croak: --read callsub, callsub2 --verbose"
373     ],
374
375     # these ones aren't tested (and nor are any "Panic:" ones):
376
377     # Error: can't parse '$field' field from cachegrind output
378     # Error: while starting cachegrind subprocess for NNNN:
379     # File '$file' contains no results
380     # File '$file' contains differing test and results names
381     # File '$file' contains differing test and sort order names
382     # Can't merge multiple read files: differing loop counts:
383 )
384 {
385     my ($args, $expected, $desc) = @$test;
386     $out = qx($bench_cmd $args 2>&1);
387     if (ref($expected)) {
388         like $out, $expected, $desc;
389     }
390     else {
391         is $out, $expected, $desc;
392     }
393 }
394
395 # ---------------------------------------------------
396 # run benchmarks
397
398
399 my $resultfile1 = tempfile(); # benchmark results for 1 perl
400 my $resultfile2 = tempfile(); # benchmark results for 2 perls
401
402 # Run a real cachegrind session and write results to file.
403 # the -j 2 is to minimally exercise its parallel facility.
404
405 note("running cachegrind for 1st perl; may be slow...");
406 $out = qx($bench_cmd -j 2 --write=$resultfile1 --tests=call::sub::empty $^X=p0 2>&1);
407 is $out, "", "--write should produce no output (1 perl)";
408 ok -s $resultfile1, "--write should create a non-empty results file (1 perl)";
409
410 # and again with 2 perls. This is also tests the 'mix read and new new
411 # perls' functionality.
412
413 note("running cachegrind for 2nd perl; may be slow...");
414 $out = qx($bench_cmd -j 2 --read=$resultfile1 --write=$resultfile2 $^X=p1 2>&1);
415 is $out, "", "--write should produce no output (2 perls)"
416     or diag("got: $out");
417 ok -s $resultfile2, "--write should create a non-empty results file (2 perls)";
418
419 # 1 perl:
420
421 # read back the results in raw form
422
423 $out = qx($bench_cmd --read=$resultfile1 --raw 2>&1);
424 like $out, $format_qrs{raw1}, "basic cachegrind raw format; 1 perl";
425
426 # and read back the results in raw compact form
427
428 $out = qx($bench_cmd --read=$resultfile1 --raw --compact=0 2>&1);
429 like $out, $format_qrs{raw_compact}, "basic cachegrind raw compact format; 1 perl";
430
431 # and read back the results in raw average form
432
433 $out = qx($bench_cmd --read=$resultfile1 --raw --average 2>&1);
434 like $out, $format_qrs{raw_average1}, "basic cachegrind raw average format; 1 perl";
435
436 # and read back the results with raw selected fields
437
438 $out = qx($bench_cmd --read=$resultfile1 --raw --fields=Ir,Dr 2>&1);
439 like $out, $format_qrs{fields1}, "basic cachegrind --fields; 1 perl";
440
441 # 2 perls:
442
443 # read back the results in relative-percent form
444
445 $out = qx($bench_cmd --read=$resultfile2 2>&1);
446 like $out, $format_qrs{percent2}, "basic cachegrind percent format; 2 perls";
447
448 # read back the results in relative-percent form with norm
449
450 $out = qx($bench_cmd --read=$resultfile2 --norm=0 2>&1);
451 like $out, $format_qrs{percent2}, "basic cachegrind percent format, norm; 2 perls";
452
453 # ditto with negative norm
454
455 $out = qx($bench_cmd --read=$resultfile2 --norm=-2 2>&1);
456 like $out, $format_qrs{percent2}, "basic cachegrind percent format, norm -2; 2 perls";
457
458 # read back the results in relative-percent form with sort
459
460 $out = qx($bench_cmd --read=$resultfile2 --sort=Ir:0 2>&1);
461 like $out, $format_qrs{percent2}, "basic cachegrind percent format, sort; 2 perls";
462
463 # read back the results in relative-percent form with sort and norm
464
465 $out = qx($bench_cmd --read=$resultfile2 --sort=Ir:0 --norm=0 2>&1);
466 like $out, $format_qrs{percent2}, "basic cachegrind percent format, sort, norm; 2 perls";
467
468 # and read back the results in raw form
469
470 $out = qx($bench_cmd --read=$resultfile2 --raw 2>&1);
471 like $out, $format_qrs{raw2}, "basic cachegrind raw format; 2 perls";
472
473 # and read back the results in raw form with norm
474
475 $out = qx($bench_cmd --read=$resultfile2 --raw --norm=0 2>&1);
476 like $out, $format_qrs{raw2}, "basic cachegrind raw format, norm; 2 perls";
477
478 # and read back the results in raw form with sort
479
480 $out = qx($bench_cmd --read=$resultfile2 --raw --sort=Ir:0 2>&1);
481 like $out, $format_qrs{raw2}, "basic cachegrind raw format, sort, norm; 2 perls";
482
483 # and read back the results in raw form with sort and norm
484
485 $out = qx($bench_cmd --read=$resultfile2 --raw --sort=Ir:0 --norm=0 2>&1);
486 like $out, $format_qrs{raw2}, "basic cachegrind raw format, sort, norm; 2 perls";
487
488 # and read back the results in compact form
489
490 $out = qx($bench_cmd --read=$resultfile2 --compact=1 2>&1);
491 like $out, $format_qrs{compact}, "basic cachegrind compact format; 2 perls";
492
493 # and read back the results in average form
494
495 $out = qx($bench_cmd --read=$resultfile2 --average 2>&1);
496 like $out, $format_qrs{average}, "basic cachegrind average format; 2 perls";
497
498 # and read back the results with selected fields
499
500 $out = qx($bench_cmd --read=$resultfile2 --fields=Ir,Dr 2>&1);
501 like $out, $format_qrs{fields2}, "basic cachegrind --fields; 2 perls";
502
503 # and read back the results in compact form with selected fields
504
505 $out = qx($bench_cmd --read=$resultfile2 --compact=1  --fields=Ir,Dr 2>&1);
506 like $out, $format_qrs{compact_fields}, "basic cachegrind compact, fields; 2 perls";
507
508 # and read back the results with 1 selected fields (this is more compact)
509
510 $out = qx($bench_cmd --read=$resultfile2 --fields=Ir 2>&1);
511 like $out, $format_qrs{'1field'}, "basic cachegrind 1 field; 2 perls";
512
513
514 # bisect
515
516 # the Ir range here is intended such that the bisect will always fail
517 $out = qx($bench_cmd --read=t/porting/bench/callsub.json --tests=call::sub::empty --bisect=Ir,100000,100001 2>&1);
518
519 is $?, 1 << 8, "--bisect: exit result: should not match";
520 like $out, qr/^Bisect: Ir had the value -?\d+\n/,
521         "--bisect: got expected output";
522
523 # multiple reads with differing test sets but common --tests subset
524
525 $out = qx($bench_cmd --read=t/porting/bench/callsub.json  --read=t/porting/bench/callsub2.json --tests=call::sub::empty 2>&1);
526 $out =~ s{\Q./perl  perl2}{    p0     p1};
527 $out =~ s{^\./perl}{p0}m;
528 like $out, $format_qrs{percent2}, "2 reads; overlapping test sets";
529
530 # A read defines what benchmarks to run
531
532 note("running cachegrind on 1 perl; may be slow...");
533 $out = qx($bench_cmd --read=t/porting/bench/callsub.json --tests=call::sub::empty $^X=p1 2>&1);
534 $out =~ s{^\./perl}{p0}m;
535 $out =~ s{\Q./perl}{    p0};
536 like $out, $format_qrs{percent2}, "1 read; 1 generate";
537
538 # Process environment and optional args.
539 # This is a minimal test that it runs - it doesn't test whether
540 # the environment and args are getting applied correctly, apart from the
541 # fact that the perls in question are being successfully executed.
542 #
543 # Also check the --autolabel feature
544
545 note("running cachegrind on 2 perls; may be slow...");
546 $cmd = <<EOF;
547 $bench_cmd
548     --read=t/porting/bench/callsub.json
549     --read=t/porting/bench/callsub2.json
550     --tests=call::sub::empty
551     --autolabel
552     --perlargs=-Ilib
553     $^X --args='-Ifoo/bar -Mstrict' --env='FOO=foo'
554     $^X --args='-Ifoo/bar'          --env='BAR=bar' --env='BAZ=baz'
555     2>&1
556 EOF
557 $cmd =~ s/\n\s+/ /g;
558 $out = qx($cmd);
559 $out =~ s{^\./perl}{p0}m;
560 $out =~ s{\Q       ./perl  perl2    p-0    p-1}
561          {           p0     p1     p2     p3};
562 like $out, $format_qrs{percent4}, "4 perls with autolabel and args and env";
563
564
565 done_testing();
566
567
568 # Templates for expected output formats.
569 #
570 # Lines starting with '#' are skipped.
571 #
572 # Lines of the form 'FORMAT: foo' start and name a new template
573 #
574 # All other lines are part of the template
575 #
576 # Entries of the form NNNN.NN are converted into a regex of the form
577 #    ( \s* -? \d+\.\d\d | - )
578 # i.e. it expects number with a fixed number of digits after the point,
579 # or a '-'.
580 #
581 # Any runs of space chars (but not tab) are converted into ' +',
582 # or ' *' if at the start of a line
583 #
584 # Entries of the form --- are converted into [-]+
585 #
586 # Lines of the form %%FOO%% are substituted with format 'FOO'
587
588
589 __END__
590 # ===================================================================
591 FORMAT: STD_HEADER
592 Key:
593     Ir   Instruction read
594     Dr   Data read
595     Dw   Data write
596     COND conditional branches
597     IND  indirect branches
598     _m   branch predict miss
599     _m1  level 1 cache miss
600     _mm  last cache (e.g. L3) miss
601     -    indeterminate percentage (e.g. 1/0)
602 # ===================================================================
603 FORMAT: percent2
604 %%STD_HEADER%%
605
606 The numbers represent relative counts per loop iteration, compared to
607 p0 at 100.0%.
608 Higher is better: for example, using half as many instructions gives 200%,
609 while using twice as many gives 50%.
610
611 call::sub::empty
612 function call with no args or body
613
614            p0     p1
615        ------ ------
616     Ir 100.00 NNN.NN
617     Dr 100.00 NNN.NN
618     Dw 100.00 NNN.NN
619   COND 100.00 NNN.NN
620    IND 100.00 NNN.NN
621
622 COND_m 100.00 NNN.NN
623  IND_m 100.00 NNN.NN
624
625  Ir_m1 100.00 NNN.NN
626  Dr_m1 100.00 NNN.NN
627  Dw_m1 100.00 NNN.NN
628
629  Ir_mm 100.00 NNN.NN
630  Dr_mm 100.00 NNN.NN
631  Dw_mm 100.00 NNN.NN
632 # ===================================================================
633 FORMAT: percent4
634 %%STD_HEADER%%
635
636 The numbers represent relative counts per loop iteration, compared to
637 p0 at 100.0%.
638 Higher is better: for example, using half as many instructions gives 200%,
639 while using twice as many gives 50%.
640
641 call::sub::empty
642 function call with no args or body
643
644            p0     p1     p2     p3
645        ------ ------ ------ ------
646     Ir 100.00 NNN.NN NNN.NN NNN.NN
647     Dr 100.00 NNN.NN NNN.NN NNN.NN
648     Dw 100.00 NNN.NN NNN.NN NNN.NN
649   COND 100.00 NNN.NN NNN.NN NNN.NN
650    IND 100.00 NNN.NN NNN.NN NNN.NN
651
652 COND_m 100.00 NNN.NN NNN.NN NNN.NN
653  IND_m 100.00 NNN.NN NNN.NN NNN.NN
654
655  Ir_m1 100.00 NNN.NN NNN.NN NNN.NN
656  Dr_m1 100.00 NNN.NN NNN.NN NNN.NN
657  Dw_m1 100.00 NNN.NN NNN.NN NNN.NN
658
659  Ir_mm 100.00 NNN.NN NNN.NN NNN.NN
660  Dr_mm 100.00 NNN.NN NNN.NN NNN.NN
661  Dw_mm 100.00 NNN.NN NNN.NN NNN.NN
662 # ===================================================================
663 FORMAT: fields2
664 %%STD_HEADER%%
665
666 The numbers represent relative counts per loop iteration, compared to
667 p0 at 100.0%.
668 Higher is better: for example, using half as many instructions gives 200%,
669 while using twice as many gives 50%.
670
671 call::sub::empty
672 function call with no args or body
673
674            p0     p1
675        ------ ------
676     Ir 100.00 NNN.NN
677     Dr 100.00 NNN.NN
678 # ===================================================================
679 FORMAT: raw1
680 %%STD_HEADER%%
681
682 The numbers represent raw counts per loop iteration.
683
684 call::sub::empty
685 function call with no args or body
686
687              p0
688        --------
689     Ir NNNNNN.N
690     Dr NNNNNN.N
691     Dw NNNNNN.N
692   COND NNNNNN.N
693    IND NNNNNN.N
694
695 COND_m NNNNNN.N
696  IND_m NNNNNN.N
697
698  Ir_m1 NNNNNN.N
699  Dr_m1 NNNNNN.N
700  Dw_m1 NNNNNN.N
701
702  Ir_mm NNNNNN.N
703  Dr_mm NNNNNN.N
704  Dw_mm NNNNNN.N
705 # ===================================================================
706 FORMAT: raw_average1
707 %%STD_HEADER%%
708
709 The numbers represent raw counts per loop iteration.
710
711 AVERAGE
712
713              p0
714        --------
715     Ir NNNNNN.N
716     Dr NNNNNN.N
717     Dw NNNNNN.N
718   COND NNNNNN.N
719    IND NNNNNN.N
720
721 COND_m NNNNNN.N
722  IND_m NNNNNN.N
723
724  Ir_m1 NNNNNN.N
725  Dr_m1 NNNNNN.N
726  Dw_m1 NNNNNN.N
727
728  Ir_mm NNNNNN.N
729  Dr_mm NNNNNN.N
730  Dw_mm NNNNNN.N
731 # ===================================================================
732 FORMAT: fields1
733 %%STD_HEADER%%
734
735 The numbers represent raw counts per loop iteration.
736
737 call::sub::empty
738 function call with no args or body
739
740              p0
741        --------
742     Ir NNNNNN.N
743     Dr NNNNNN.N
744 # ===================================================================
745 FORMAT: raw2
746 %%STD_HEADER%%
747
748 The numbers represent raw counts per loop iteration.
749
750 call::sub::empty
751 function call with no args or body
752
753              p0       p1
754        -------- --------
755     Ir NNNNNN.N NNNNNN.N
756     Dr NNNNNN.N NNNNNN.N
757     Dw NNNNNN.N NNNNNN.N
758   COND NNNNNN.N NNNNNN.N
759    IND NNNNNN.N NNNNNN.N
760
761 COND_m NNNNNN.N NNNNNN.N
762  IND_m NNNNNN.N NNNNNN.N
763
764  Ir_m1 NNNNNN.N NNNNNN.N
765  Dr_m1 NNNNNN.N NNNNNN.N
766  Dw_m1 NNNNNN.N NNNNNN.N
767
768  Ir_mm NNNNNN.N NNNNNN.N
769  Dr_mm NNNNNN.N NNNNNN.N
770  Dw_mm NNNNNN.N NNNNNN.N
771 # ===================================================================
772 FORMAT: compact
773 %%STD_HEADER%%
774
775 The numbers represent relative counts per loop iteration, compared to
776 p0 at 100.0%.
777 Higher is better: for example, using half as many instructions gives 200%,
778 while using twice as many gives 50%.
779
780 Results for p1
781
782      Ir     Dr     Dw   COND    IND COND_m  IND_m  Ir_m1  Dr_m1  Dw_m1  Ir_mm  Dr_mm  Dw_mm
783  ------ ------ ------ ------ ------ ------ ------ ------ ------ ------ ------ ------ ------
784  NNN.NN NNN.NN NNN.NN NNN.NN NNN.NN NNN.NN NNN.NN NNN.NN NNN.NN NNN.NN NNN.NN NNN.NN NNN.NN  call::sub::empty   function call with no args or body
785 # ===================================================================
786 FORMAT: compact_fields
787 %%STD_HEADER%%
788
789 The numbers represent relative counts per loop iteration, compared to
790 p0 at 100.0%.
791 Higher is better: for example, using half as many instructions gives 200%,
792 while using twice as many gives 50%.
793
794 Results for p1
795
796      Ir     Dr
797  ------ ------
798  NNN.NN NNN.NN  call::sub::empty   function call with no args or body
799 # ===================================================================
800 FORMAT: 1field
801 %%STD_HEADER%%
802
803 The numbers represent relative counts per loop iteration, compared to
804 p0 at 100.0%.
805 Higher is better: for example, using half as many instructions gives 200%,
806 while using twice as many gives 50%.
807
808 Results for field Ir
809
810                      p0     p1
811                  ------ ------
812 call::sub::empty NNN.NN NNN.NN
813 # ===================================================================
814 FORMAT: average
815 %%STD_HEADER%%
816
817 The numbers represent relative counts per loop iteration, compared to
818 p0 at 100.0%.
819 Higher is better: for example, using half as many instructions gives 200%,
820 while using twice as many gives 50%.
821
822 AVERAGE
823
824            p0     p1
825        ------ ------
826     Ir 100.00 NNN.NN
827     Dr 100.00 NNN.NN
828     Dw 100.00 NNN.NN
829   COND 100.00 NNN.NN
830    IND 100.00 NNN.NN
831
832 COND_m 100.00 NNN.NN
833  IND_m 100.00 NNN.NN
834
835  Ir_m1 100.00 NNN.NN
836  Dr_m1 100.00 NNN.NN
837  Dw_m1 100.00 NNN.NN
838
839  Ir_mm 100.00 NNN.NN
840  Dr_mm 100.00 NNN.NN
841  Dw_mm 100.00 NNN.NN
842 # ===================================================================
843 FORMAT: raw_compact
844 %%STD_HEADER%%
845
846 The numbers represent raw counts per loop iteration.
847
848 Results for p0
849
850       Ir      Dr      Dw    COND     IND  COND_m   IND_m   Ir_m1   Dr_m1   Dw_m1   Ir_mm   Dr_mm   Dw_mm
851   ------  ------  ------  ------  ------  ------  ------  ------  ------  ------  ------  ------  ------
852  NNNNN.N NNNNN.N NNNNN.N NNNNN.N NNNNN.N NNNNN.N NNNNN.N NNNNN.N NNNNN.N NNNNN.N NNNNN.N NNNNN.N NNNNN.N  call::sub::empty   function call with no args or body
853 # ===================================================================