diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-15 19:43:11 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-15 19:43:11 +0000 |
commit | fc22b3d6507c6745911b9dfcc68f1e665ae13dbc (patch) | |
tree | ce1e3bce06471410239a6f41282e328770aa404a /upstream/mageia-cauldron/man3pm/Benchmark.3pm | |
parent | Initial commit. (diff) | |
download | manpages-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.3pm | 507 |
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. |