summaryrefslogtreecommitdiffstats
path: root/upstream/mageia-cauldron/man3pm/Benchmark.3pm
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-15 19:43:11 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-15 19:43:11 +0000
commitfc22b3d6507c6745911b9dfcc68f1e665ae13dbc (patch)
treece1e3bce06471410239a6f41282e328770aa404a /upstream/mageia-cauldron/man3pm/Benchmark.3pm
parentInitial commit. (diff)
downloadmanpages-l10n-fc22b3d6507c6745911b9dfcc68f1e665ae13dbc.tar.xz
manpages-l10n-fc22b3d6507c6745911b9dfcc68f1e665ae13dbc.zip
Adding upstream version 4.22.0.upstream/4.22.0
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'upstream/mageia-cauldron/man3pm/Benchmark.3pm')
-rw-r--r--upstream/mageia-cauldron/man3pm/Benchmark.3pm507
1 files changed, 507 insertions, 0 deletions
diff --git a/upstream/mageia-cauldron/man3pm/Benchmark.3pm b/upstream/mageia-cauldron/man3pm/Benchmark.3pm
new file mode 100644
index 00000000..1a5e6125
--- /dev/null
+++ b/upstream/mageia-cauldron/man3pm/Benchmark.3pm
@@ -0,0 +1,507 @@
+.\" -*- mode: troff; coding: utf-8 -*-
+.\" Automatically generated by Pod::Man 5.01 (Pod::Simple 3.43)
+.\"
+.\" Standard preamble:
+.\" ========================================================================
+.de Sp \" Vertical space (when we can't use .PP)
+.if t .sp .5v
+.if n .sp
+..
+.de Vb \" Begin verbatim text
+.ft CW
+.nf
+.ne \\$1
+..
+.de Ve \" End verbatim text
+.ft R
+.fi
+..
+.\" \*(C` and \*(C' are quotes in nroff, nothing in troff, for use with C<>.
+.ie n \{\
+. ds C` ""
+. ds C' ""
+'br\}
+.el\{\
+. ds C`
+. ds C'
+'br\}
+.\"
+.\" Escape single quotes in literal strings from groff's Unicode transform.
+.ie \n(.g .ds Aq \(aq
+.el .ds Aq '
+.\"
+.\" If the F register is >0, we'll generate index entries on stderr for
+.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
+.\" entries marked with X<> in POD. Of course, you'll have to process the
+.\" output yourself in some meaningful fashion.
+.\"
+.\" Avoid warning from groff about undefined register 'F'.
+.de IX
+..
+.nr rF 0
+.if \n(.g .if rF .nr rF 1
+.if (\n(rF:(\n(.g==0)) \{\
+. if \nF \{\
+. de IX
+. tm Index:\\$1\t\\n%\t"\\$2"
+..
+. if !\nF==2 \{\
+. nr % 0
+. nr F 2
+. \}
+. \}
+.\}
+.rr rF
+.\" ========================================================================
+.\"
+.IX Title "Benchmark 3pm"
+.TH Benchmark 3pm 2023-11-28 "perl v5.38.2" "Perl Programmers Reference Guide"
+.\" For nroff, turn off justification. Always turn off hyphenation; it makes
+.\" way too many mistakes in technical documents.
+.if n .ad l
+.nh
+.SH NAME
+Benchmark \- benchmark running times of Perl code
+.SH SYNOPSIS
+.IX Header "SYNOPSIS"
+.Vb 1
+\& use Benchmark qw(:all) ;
+\&
+\& timethis ($count, "code");
+\&
+\& # Use Perl code in strings...
+\& timethese($count, {
+\& \*(AqName1\*(Aq => \*(Aq...code1...\*(Aq,
+\& \*(AqName2\*(Aq => \*(Aq...code2...\*(Aq,
+\& });
+\&
+\& # ... or use subroutine references.
+\& timethese($count, {
+\& \*(AqName1\*(Aq => sub { ...code1... },
+\& \*(AqName2\*(Aq => sub { ...code2... },
+\& });
+\&
+\& # cmpthese can be used both ways as well
+\& cmpthese($count, {
+\& \*(AqName1\*(Aq => \*(Aq...code1...\*(Aq,
+\& \*(AqName2\*(Aq => \*(Aq...code2...\*(Aq,
+\& });
+\&
+\& cmpthese($count, {
+\& \*(AqName1\*(Aq => sub { ...code1... },
+\& \*(AqName2\*(Aq => sub { ...code2... },
+\& });
+\&
+\& # ...or in two stages
+\& $results = timethese($count,
+\& {
+\& \*(AqName1\*(Aq => sub { ...code1... },
+\& \*(AqName2\*(Aq => sub { ...code2... },
+\& },
+\& \*(Aqnone\*(Aq
+\& );
+\& cmpthese( $results ) ;
+\&
+\& $t = timeit($count, \*(Aq...other code...\*(Aq)
+\& print "$count loops of other code took:",timestr($t),"\en";
+\&
+\& $t = countit($time, \*(Aq...other code...\*(Aq)
+\& $count = $t\->iters ;
+\& print "$count loops of other code took:",timestr($t),"\en";
+\&
+\& # enable hires wallclock timing if possible
+\& use Benchmark \*(Aq:hireswallclock\*(Aq;
+.Ve
+.SH DESCRIPTION
+.IX Header "DESCRIPTION"
+The Benchmark module encapsulates a number of routines to help you
+figure out how long it takes to execute some code.
+.PP
+timethis \- run a chunk of code several times
+.PP
+timethese \- run several chunks of code several times
+.PP
+cmpthese \- print results of timethese as a comparison chart
+.PP
+timeit \- run a chunk of code and see how long it goes
+.PP
+countit \- see how many times a chunk of code runs in a given time
+.SS Methods
+.IX Subsection "Methods"
+.IP new 10
+.IX Item "new"
+Returns the current time. Example:
+.Sp
+.Vb 6
+\& use Benchmark;
+\& $t0 = Benchmark\->new;
+\& # ... your code here ...
+\& $t1 = Benchmark\->new;
+\& $td = timediff($t1, $t0);
+\& print "the code took:",timestr($td),"\en";
+.Ve
+.IP debug 10
+.IX Item "debug"
+Enables or disable debugging by setting the \f(CW$Benchmark::Debug\fR flag:
+.Sp
+.Vb 3
+\& Benchmark\->debug(1);
+\& $t = timeit(10, \*(Aq 5 ** $Global \*(Aq);
+\& Benchmark\->debug(0);
+.Ve
+.IP iters 10
+.IX Item "iters"
+Returns the number of iterations.
+.SS "Standard Exports"
+.IX Subsection "Standard Exports"
+The following routines will be exported into your namespace
+if you use the Benchmark module:
+.IP "timeit(COUNT, CODE)" 10
+.IX Item "timeit(COUNT, CODE)"
+Arguments: COUNT is the number of times to run the loop, and CODE is
+the code to run. CODE may be either a code reference or a string to
+be eval'd; either way it will be run in the caller's package.
+.Sp
+Returns: a Benchmark object.
+.IP "timethis ( COUNT, CODE, [ TITLE, [ STYLE ]] )" 10
+.IX Item "timethis ( COUNT, CODE, [ TITLE, [ STYLE ]] )"
+Time COUNT iterations of CODE. CODE may be a string to eval or a
+code reference; either way the CODE will run in the caller's package.
+Results will be printed to STDOUT as TITLE followed by the times.
+TITLE defaults to "timethis COUNT" if none is provided. STYLE
+determines the format of the output, as described for \fBtimestr()\fR below.
+.Sp
+The COUNT can be zero or negative: this means the \fIminimum number of
+CPU seconds\fR to run. A zero signifies the default of 3 seconds. For
+example to run at least for 10 seconds:
+.Sp
+.Vb 1
+\& timethis(\-10, $code)
+.Ve
+.Sp
+or to run two pieces of code tests for at least 3 seconds:
+.Sp
+.Vb 1
+\& timethese(0, { test1 => \*(Aq...\*(Aq, test2 => \*(Aq...\*(Aq})
+.Ve
+.Sp
+CPU seconds is, in UNIX terms, the user time plus the system time of
+the process itself, as opposed to the real (wallclock) time and the
+time spent by the child processes. Less than 0.1 seconds is not
+accepted (\-0.01 as the count, for example, will cause a fatal runtime
+exception).
+.Sp
+Note that the CPU seconds is the \fBminimum\fR time: CPU scheduling and
+other operating system factors may complicate the attempt so that a
+little bit more time is spent. The benchmark output will, however,
+also tell the number of \f(CW$code\fR runs/second, which should be a more
+interesting number than the actually spent seconds.
+.Sp
+Returns a Benchmark object.
+.IP "timethese ( COUNT, CODEHASHREF, [ STYLE ] )" 10
+.IX Item "timethese ( COUNT, CODEHASHREF, [ STYLE ] )"
+The CODEHASHREF is a reference to a hash containing names as keys
+and either a string to eval or a code reference for each value.
+For each (KEY, VALUE) pair in the CODEHASHREF, this routine will
+call
+.Sp
+.Vb 1
+\& timethis(COUNT, VALUE, KEY, STYLE)
+.Ve
+.Sp
+The routines are called in string comparison order of KEY.
+.Sp
+The COUNT can be zero or negative, see \fBtimethis()\fR.
+.Sp
+Returns a hash reference of Benchmark objects, keyed by name.
+.IP "timediff ( T1, T2 )" 10
+.IX Item "timediff ( T1, T2 )"
+Returns the difference between two Benchmark times as a Benchmark
+object suitable for passing to \fBtimestr()\fR.
+.IP "timestr ( TIMEDIFF, [ STYLE, [ FORMAT ] ] )" 10
+.IX Item "timestr ( TIMEDIFF, [ STYLE, [ FORMAT ] ] )"
+Returns a string that formats the times in the TIMEDIFF object in
+the requested STYLE. TIMEDIFF is expected to be a Benchmark object
+similar to that returned by \fBtimediff()\fR.
+.Sp
+STYLE can be any of 'all', 'none', 'noc', 'nop' or 'auto'. 'all' shows
+each of the 5 times available ('wallclock' time, user time, system time,
+user time of children, and system time of children). 'noc' shows all
+except the two children times. 'nop' 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.
+.Sp
+FORMAT is the \fBprintf\fR\|(3)\-style format specifier (without the
+leading '%') to use to print the times. It defaults to '5.2f'.
+.SS "Optional Exports"
+.IX Subsection "Optional Exports"
+The following routines will be exported into your namespace
+if you specifically ask that they be imported:
+.IP "clearcache ( COUNT )" 10
+.IX Item "clearcache ( COUNT )"
+Clear the cached time for COUNT rounds of the null loop.
+.IP "clearallcache ( )" 10
+.IX Item "clearallcache ( )"
+Clear all cached times.
+.IP "cmpthese ( COUNT, CODEHASHREF, [ STYLE ] )" 10
+.IX Item "cmpthese ( COUNT, CODEHASHREF, [ STYLE ] )"
+.PD 0
+.IP "cmpthese ( RESULTSHASHREF, [ STYLE ] )" 10
+.IX Item "cmpthese ( RESULTSHASHREF, [ STYLE ] )"
+.PD
+Optionally calls \fBtimethese()\fR, then outputs comparison chart. This:
+.Sp
+.Vb 1
+\& cmpthese( \-1, { a => "++\e$i", b => "\e$i *= 2" } ) ;
+.Ve
+.Sp
+outputs a chart like:
+.Sp
+.Vb 3
+\& Rate b a
+\& b 2831802/s \-\- \-61%
+\& a 7208959/s 155% \-\-
+.Ve
+.Sp
+This chart is sorted from slowest to fastest, and shows the percent speed
+difference between each pair of tests.
+.Sp
+\&\f(CW\*(C`cmpthese\*(C'\fR can also be passed the data structure that \fBtimethese()\fR returns:
+.Sp
+.Vb 3
+\& $results = timethese( \-1,
+\& { a => "++\e$i", b => "\e$i *= 2" } ) ;
+\& cmpthese( $results );
+.Ve
+.Sp
+in case you want to see both sets of results.
+If the first argument is an unblessed hash reference,
+that is RESULTSHASHREF; otherwise that is COUNT.
+.Sp
+Returns a reference to an ARRAY of rows, each row is an ARRAY of cells from the
+above chart, including labels. This:
+.Sp
+.Vb 2
+\& my $rows = cmpthese( \-1,
+\& { a => \*(Aq++$i\*(Aq, b => \*(Aq$i *= 2\*(Aq }, "none" );
+.Ve
+.Sp
+returns a data structure like:
+.Sp
+.Vb 5
+\& [
+\& [ \*(Aq\*(Aq, \*(AqRate\*(Aq, \*(Aqb\*(Aq, \*(Aqa\*(Aq ],
+\& [ \*(Aqb\*(Aq, \*(Aq2885232/s\*(Aq, \*(Aq\-\-\*(Aq, \*(Aq\-59%\*(Aq ],
+\& [ \*(Aqa\*(Aq, \*(Aq7099126/s\*(Aq, \*(Aq146%\*(Aq, \*(Aq\-\-\*(Aq ],
+\& ]
+.Ve
+.Sp
+\&\fBNOTE\fR: This result value differs from previous versions, which returned
+the \f(CWtimethese()\fR result structure. If you want that, just use the two
+statement \f(CW\*(C`timethese\*(C'\fR...\f(CW\*(C`cmpthese\*(C'\fR idiom shown above.
+.Sp
+Incidentally, note the variance in the result values between the two examples;
+this is typical of benchmarking. If this were a real benchmark, you would
+probably want to run a lot more iterations.
+.IP "countit(TIME, CODE)" 10
+.IX Item "countit(TIME, CODE)"
+Arguments: TIME is the minimum length of time to run CODE for, and CODE is
+the code to run. CODE may be either a code reference or a string to
+be eval'd; either way it will be run in the caller's package.
+.Sp
+TIME is \fInot\fR negative. \fBcountit()\fR will run the loop many times to
+calculate the speed of CODE before running it for TIME. The actual
+time run for will usually be greater than TIME due to system clock
+resolution, so it's best to look at the number of iterations divided
+by the times that you are concerned with, not just the iterations.
+.Sp
+Returns: a Benchmark object.
+.IP "disablecache ( )" 10
+.IX Item "disablecache ( )"
+Disable caching of timings for the null loop. This will force Benchmark
+to recalculate these timings for each new piece of code timed.
+.IP "enablecache ( )" 10
+.IX Item "enablecache ( )"
+Enable caching of timings for the null loop. The time taken for COUNT
+rounds of the null loop will be calculated only once for each
+different COUNT used.
+.IP "timesum ( T1, T2 )" 10
+.IX Item "timesum ( T1, T2 )"
+Returns the sum of two Benchmark times as a Benchmark object suitable
+for passing to \fBtimestr()\fR.
+.SS :hireswallclock
+.IX Subsection ":hireswallclock"
+If the Time::HiRes module has been installed, you can specify the
+special tag \f(CW\*(C`:hireswallclock\*(C'\fR for Benchmark (if Time::HiRes is not
+available, the tag will be silently ignored). This tag will cause the
+wallclock time to be measured in microseconds, instead of integer
+seconds. Note though that the speed computations are still conducted
+in CPU time, not wallclock time.
+.SH "Benchmark Object"
+.IX Header "Benchmark Object"
+Many of the functions in this module return a Benchmark object,
+or in the case of \f(CWtimethese()\fR, a reference to a hash, the values of
+which are Benchmark objects. This is useful if you want to store or
+further process results from Benchmark functions.
+.PP
+Internally the Benchmark object holds timing values,
+described in "NOTES" below.
+The following methods can be used to access them:
+.IP cpu_p 4
+.IX Item "cpu_p"
+Total CPU (User + System) of the main (parent) process.
+.IP cpu_c 4
+.IX Item "cpu_c"
+Total CPU (User + System) of any children processes.
+.IP cpu_a 4
+.IX Item "cpu_a"
+Total CPU of parent and any children processes.
+.IP real 4
+.IX Item "real"
+Real elapsed time "wallclock seconds".
+.IP iters 4
+.IX Item "iters"
+Number of iterations run.
+.PP
+The following illustrates use of the Benchmark object:
+.PP
+.Vb 2
+\& $result = timethis(100000, sub { ... });
+\& print "total CPU = ", $result\->cpu_a, "\en";
+.Ve
+.SH NOTES
+.IX Header "NOTES"
+The data is stored as a list of values from the time and times
+functions:
+.PP
+.Vb 1
+\& ($real, $user, $system, $children_user, $children_system, $iters)
+.Ve
+.PP
+in seconds for the whole loop (not divided by the number of rounds).
+.PP
+The timing is done using \fBtime\fR\|(3) and \fBtimes\fR\|(3).
+.PP
+Code is executed in the caller's package.
+.PP
+The time of the null loop (a loop with the same
+number of rounds but empty loop body) is subtracted
+from the time of the real loop.
+.PP
+The null loop times can be cached, the key being the
+number of rounds. The caching can be controlled using
+calls like these:
+.PP
+.Vb 2
+\& clearcache($key);
+\& clearallcache();
+\&
+\& disablecache();
+\& enablecache();
+.Ve
+.PP
+Caching is off by default, as it can (usually slightly) decrease
+accuracy and does not usually noticeably affect runtimes.
+.SH EXAMPLES
+.IX Header "EXAMPLES"
+For example,
+.PP
+.Vb 6
+\& use Benchmark qw( cmpthese ) ;
+\& $x = 3;
+\& cmpthese( \-5, {
+\& a => sub{$x*$x},
+\& b => sub{$x**2},
+\& } );
+.Ve
+.PP
+outputs something like this:
+.PP
+.Vb 4
+\& Benchmark: running a, b, each for at least 5 CPU seconds...
+\& Rate b a
+\& b 1559428/s \-\- \-62%
+\& a 4152037/s 166% \-\-
+.Ve
+.PP
+while
+.PP
+.Vb 7
+\& use Benchmark qw( timethese cmpthese ) ;
+\& $x = 3;
+\& $r = timethese( \-5, {
+\& a => sub{$x*$x},
+\& b => sub{$x**2},
+\& } );
+\& cmpthese $r;
+.Ve
+.PP
+outputs something like this:
+.PP
+.Vb 6
+\& Benchmark: running a, b, each for at least 5 CPU seconds...
+\& a: 10 wallclock secs ( 5.14 usr + 0.13 sys = 5.27 CPU) @ 3835055.60/s (n=20210743)
+\& b: 5 wallclock secs ( 5.41 usr + 0.00 sys = 5.41 CPU) @ 1574944.92/s (n=8520452)
+\& Rate b a
+\& b 1574945/s \-\- \-59%
+\& a 3835056/s 144% \-\-
+.Ve
+.SH INHERITANCE
+.IX Header "INHERITANCE"
+Benchmark inherits from no other class, except of course
+from Exporter.
+.SH CAVEATS
+.IX Header "CAVEATS"
+Comparing eval'd strings with code references will give you
+inaccurate results: a code reference will show a slightly slower
+execution time than the equivalent eval'd string.
+.PP
+The real time timing is done using \fBtime\fR\|(2) and
+the granularity is therefore only one second.
+.PP
+Short tests may produce negative figures because perl
+can appear to take longer to execute the empty loop
+than a short test; try:
+.PP
+.Vb 1
+\& timethis(100,\*(Aq1\*(Aq);
+.Ve
+.PP
+The system time of the null loop might be slightly
+more than the system time of the loop with the actual
+code and therefore the difference might end up being < 0.
+.SH "SEE ALSO"
+.IX Header "SEE ALSO"
+Devel::NYTProf \- a Perl code profiler
+.SH AUTHORS
+.IX Header "AUTHORS"
+Jarkko Hietaniemi <\fIjhi@iki.fi\fR>, Tim Bunce <\fITim.Bunce@ig.co.uk\fR>
+.SH "MODIFICATION HISTORY"
+.IX Header "MODIFICATION HISTORY"
+September 8th, 1994; by Tim Bunce.
+.PP
+March 28th, 1997; by Hugo van der Sanden: added support for code
+references and the already documented 'debug' method; revamped
+documentation.
+.PP
+April 04\-07th, 1997: by Jarkko Hietaniemi, added the run-for-some-time
+functionality.
+.PP
+September, 1999; by Barrie Slaymaker: math fixes and accuracy and
+efficiency tweaks. Added \fBcmpthese()\fR. A result is now returned from
+\&\fBtimethese()\fR. Exposed \fBcountit()\fR (was \fBrunfor()\fR).
+.PP
+December, 2001; by Nicholas Clark: make \fBtimestr()\fR recognise the style 'none'
+and return an empty string. If cmpthese is calling timethese, make it pass the
+style in. (so that 'none' will suppress output). Make sub new dump its
+debugging output to STDERR, to be consistent with everything else.
+All bugs found while writing a regression test.
+.PP
+September, 2002; by Jarkko Hietaniemi: add ':hireswallclock' special tag.
+.PP
+February, 2004; by Chia-liang Kao: make cmpthese and timestr use time
+statistics for children instead of parent when the style is 'nop'.
+.PP
+November, 2007; by Christophe Grosjean: make cmpthese and timestr compute
+time consistently with style argument, default is 'all' not 'noc' any more.