B-Stats
view release on metacpan or search on metacpan
-t *table*
Tabular list of -c, -e and -r results.
-u *summary*
Short summary only, no op class. With -t only the final table(s).
-F *Files*
Prints included file names
-x *fragmentation* NOT YET
Calculates the optree *fragmentation*. 0.0 is perfect, 1.0 is very
bad.
A perfect optree has no null ops and every op->next is immediately
next to the op.
-f<op,...> *filter* NOT YET
Filter for op names and classes. Only calculate the given ops, resp.
op class.
perl -MB::Stats,-fLOGOP,-fCOP,-fconcat myprog.pl
There is no heuristic to check the string for possible non-ascii strings, there is no ascii pragma (no utf8 would be the correct name) to prevent from loading these tables.
With B::C I introduced -fno-fold for 5.13.9 to save 1.6MB executable size on 32-bit
when utf8 folding is not required.
Anyway, I'm now measuring the size of the optree at certain stages with my new module B::Stats. It unfortunately requires B, which itself includes 14 files, 3821 lines and ca. 4883 ops. I have to subtract this constant overhead, similar to a profiler...
B::Stats counts all ops statically at compile-time and end-time, to see which run-time loaded modules are added, and also counts the actually performed ops dynamically at run-time.
The B::Stats output also give you exact size and performance numbers independent of the CPU and machine load, contrary to heavy benchmarks. Of course certain ops are more costly than others, I haven't averaged yet the typical op costs to output bette...
B::Stats is still in its early stage. The options -l<logfile> and -f<filter> and -C fragmentation are not yet implemented.
It is roughly comparable to Devel::Size. Devel::Size does more, this also includes the size of the data, B::Stats just counts the ops, no data.
The primary need for B::Stats was to come up with fair numbers of op distributions for benchmarks. A benchmark should not be too slow but should cover the typical run-time cost of the to-be-tested program. So the static and run-time distribution of t...
Running a single benchmark function 10.000 times is a waste of time if the cost stabilizes after 5-15 runs and is measurable and if the benchmark does not compare to the actual usage. Hence B::Stats.
lib/B/Stats.pm view on Meta::CPAN
=item -u I<summary>
Short summary only, no op class.
With -t only the final table(s).
=item -F I<Files>
Prints included file names
=item -x I<fragmentation> B<NOT YET>
Calculates the optree I<fragmentation>. 0.0 is perfect, 1.0 is very bad.
A perfect optree has no null ops and every op->next is immediately next
to the op.
=item -f<op,...> I<filter> B<NOT YET>
Filter for op names and classes. Only calculate the given ops, resp. op class.
perl -MB::Stats,-fLOGOP,-fCOP,-fconcat myprog.pl
lib/B/Stats.pm view on Meta::CPAN
use strict;
# B includes 14 files and 3821 lines. overhead subtracted with B::Stats::Minus
use B;
use B::Stats::Minus;
# XSLoader adds 0 files and 0 lines, already with B.
# Changed to DynaLoader
# Opcodes-0.10 adds 6 files and 5303-3821 lines: Carp, AutoLoader, subs
# Opcodes-0.11 adds 2 files and 4141-3821 lines: subs
# use Opcodes; # deferred to run-time below
our ($static, @runtime, $compiled, $imported, $LOG);
my (%opt, $nops, $rops, @all_subs, $frag, %roots);
my ($c_count, $e_count, $r_count);
# check options
sub import {
$DB::single = 1 if defined &DB::DB;
#print STDERR "opt: ",join(',',@_),"; "; # for Debugging
for (@_) { # switch bundling without Getopt bloat
if (/^-?([acerxtFu])(.*)$/) {
$opt{$1} = 1;
my $rest = $2;
( run in 0.939 second using v1.01-cache-2.11-cpan-364913b4093 )