This module is a simple wrapper around Linux libperf
.
It is intended for use in measuring in-process execution time for precise benchmarking, whether it will actually be useful for that remains to be seen.
You will need to install the package (Redhat-ish) or build from source
(Debian-ish at this time). libperf
is supplied as part of the
Linux source tree, it is not theonewolf/libperf
from Github.
To build from source extract the linux sources, the more recent the better:
cd tools/lib/perf
make prefix=/where/to/install install
When configuring Linux-libperf-Simple
, ensure libperf.pc
from the libperf
build is in the PKG_CONFIG_PATH
environment variable, eg.:
PKG_CONFIG_PATH=~/local/libperf/lib64/pkgconfig/ perl Makefile.PL
To actually use this module you will either need to be root, or
kernel.perf_event_paranoid
may need to be set to a lower value than
the default, look this up before using it.
If you have a one-liner you want to test:
$ perl -Mblib -MLinux::libperf::Simple=report -e 'report(sub { for (1.. 100_000_000) { } })'
branch-misses: 5,236
branches: 2,133,471,368
bus-cycles: 15,710,865
cache-misses: 3,377
cache-references: 29,733
context-switches: 3
cpu-migrations: 1
cycles: 2,373,174,556
instructions: 10,194,546,708
page-faults: 0
task-clock: 916,441,424
Otherwise you can create an object and start and stop stats collection, and finally fetch the results:
use Linux::libperf::Simple;
my $perf = Linux::libperf::Simple->new;
$perf->enable;
# code to benchmark here
...
$perf->disable;
my $results = $perf->results;
use Data::Dumper;
print Dumper($results);
Unfortunately libperf
's reporting isn't very good, if libperf fails
to initialize try using strace
to see details on which system call
actually failed, eg you might try:
strace -o trace.txt perl -MLinux::libperf::Simple=run -e 'run(sub {})'
and look over trace.txt
to see why it failed.