This is a live mirror of the Perl 5 development currently hosted at
add t/perf/benchmarks, t/perf/benchmarks.t
authorDavid Mitchell <>
Tue, 21 Oct 2014 14:26:08 +0000 (15:26 +0100)
committerDavid Mitchell <>
Sun, 26 Oct 2014 16:53:50 +0000 (16:53 +0000)
t/perf/benchmarks is a file intended to contain snippets of code
that can be usefully benchmarked or otherwise profiled.

The basic idea is that any time you add an optimisation that is intended
to make a particular construct faster, then you should add that construct
to this file.

Under the normal test suite, the test file benchmarks.t does a basic
compile and run of each of these snippets; not to test performance,
but just to ensure that the code doesn't have errors.

Over time, it is intended that various measurement and profiling tools
will be written that can run selected (or all) snippets in various
environments. These will not be run as part of a normal test suite run.

t/perf/benchmarks [new file with mode: 0644]
t/perf/benchmarks.t [new file with mode: 0644]

index c727314..5a26bdb 100644 (file)
@@ -5339,6 +5339,8 @@ t/op/warn.t                       See if warn works
 t/op/while.t                   See if while loops work
 t/op/write.t                   See if write works (formats work)
 t/op/yadayada.t                        See if ... works
+t/perf/benchmarks              snippets of benchmarking/profiling code
+t/perf/benchmarks.t            test t/perf/benchmarks syntax
 t/perf/opcount.t               See if optimised subs have the right op counts
 t/perf/optree.t                        Test presence of some op optimisations
 t/perf/speed.t                 See if optimisations are keeping things fast
diff --git a/t/perf/benchmarks b/t/perf/benchmarks
new file mode 100644 (file)
index 0000000..6424934
--- /dev/null
@@ -0,0 +1,45 @@
+# This file specifies a hash-of-hashes that define snippets of code that
+# can be run by various measurement and profiling tools.
+# The basic idea is that any time you add an optimisation that is intended
+# to make a particular construct faster, then you should add that construct
+# to this file.
+# Under the normal test suite, the test file benchmarks.t does a basic
+# compile and run of each of these snippets; not to test performance,
+# but just to ensure that the code doesn't have errors.
+# Over time, it is intended that various measurement and profiling tools
+# will be written that can run selected (or all) snippets in various
+# environments. These will not be run as part of a normal test suite run.
+# This file is designed to be read in by 'do' (and in such a way that
+# multiple versions of this file from different releases can be read in
+# by a single process).
+# Each key of the top-level hash is a token that describes a particular
+# test. Code will be compiled in the package named after the token, so it
+# should match /^\w+$/a. It is intended that this can be used on the
+# command line of tools to select particular tests, .
+# Each value is also a hash, with three fields:
+#   desc is a description of the test
+#   setup is a string containing setup code
+#   code  is a string containing the code to run in a loop
+# So typically a benchmark tool might do something like
+#   eval "package $token; $setup; for (1..1000000) { $code }"
+    arg_assignment => {
+        desc    => 'assignment to local vars from @_',
+        setup   => 'sub arg_assignment { my ($a, $b, $c) = @_ }',
+        code    => 'arg_assignment(1,2,3)',
+    },
diff --git a/t/perf/benchmarks.t b/t/perf/benchmarks.t
new file mode 100644 (file)
index 0000000..c5ec3df
--- /dev/null
@@ -0,0 +1,47 @@
+# Execute the various code snippets in t/perf/benchmarks
+# to ensure that they are all syntactically correct
+    chdir 't';
+    require './';
+    @INC = ('.', '../lib');
+use warnings;
+use strict;
+my $file = 'perf/benchmarks';
+my $benchmarks = do $file;
+die $@ if $@;
+die "$! while trying to read '$file'" if $!;
+die "'$file' did not return a hash ref\n" unless ref $benchmarks eq 'HASH';
+plan keys(%$benchmarks) * 3;
+# check the hash of hashes is minimally consistent in format
+for my $token (sort keys %$benchmarks) {
+    like($token, qr/^[a-zA-z]\w*$/a, "legal token: $token");
+    my $keys = join('-', sort keys %{$benchmarks->{$token}});
+    is($keys, 'code-desc-setup', "legal keys:  $token");
+# check that each bit of code compiles and runs
+for my $token (sort keys %$benchmarks) {
+    my $b = $benchmarks->{$token};
+    my $code = "package $token; $b->{setup}; for (1..1) { $b->{code} } 1;";
+    ok(eval $code, "running $token")
+        or do {
+            diag("code:");
+            diag($code);
+            diag("gave:");
+            diag($@);
+        }