=encoding euc-jp =head1 NAME =begin original Benchmark - benchmark running times of Perl code =end original Benchmark - Perl コードの実行時間のベンチマークを行なう =head1 SYNOPSIS use Benchmark qw(:all) ; timethis ($count, "code"); # Use Perl code in strings... timethese($count, { 'Name1' => '...code1...', 'Name2' => '...code2...', }); # ... or use subroutine references. timethese($count, { 'Name1' => sub { ...code1... }, 'Name2' => sub { ...code2... }, }); # cmpthese can be used both ways as well cmpthese($count, { 'Name1' => '...code1...', 'Name2' => '...code2...', }); cmpthese($count, { 'Name1' => sub { ...code1... }, 'Name2' => sub { ...code2... }, }); # ...or in two stages $results = timethese($count, { 'Name1' => sub { ...code1... }, 'Name2' => sub { ...code2... }, }, 'none' ); cmpthese( $results ) ; $t = timeit($count, '...other code...') print "$count loops of other code took:",timestr($t),"\n"; $t = countit($time, '...other code...') $count = $t->iters ; print "$count loops of other code took:",timestr($t),"\n"; # enable hires wallclock timing if possible use Benchmark ':hireswallclock'; =head1 DESCRIPTION =begin original The Benchmark module encapsulates a number of routines to help you figure out how long it takes to execute some code. =end original Benchmark モジュールは、コードの実行時間を計測する手助けをするルーチン群を カプセル化するものです。 =begin original timethis - run a chunk of code several times =end original timethis - コードを何回か実行する =begin original timethese - run several chunks of code several times =end original timethese - いくつかのコードを何回か実行する =begin original cmpthese - print results of timethese as a comparison chart =end original cmpthese - timethese の結果を比較表として表示する =begin original timeit - run a chunk of code and see how long it goes =end original timeit - コードを実行し、時間を計測する =begin original countit - see how many times a chunk of code runs in a given time =end original countit - コードの塊を与えられた時間内に何回実行できるかを調べる =head2 Methods (メソッド) =over 10 =item new =begin original Returns the current time. Example: =end original 現在時刻を返します。 例えば: use Benchmark; $t0 = new Benchmark; # ... your code here ... $t1 = new Benchmark; $td = timediff($t1, $t0); print "the code took:",timestr($td),"\n"; =item debug =begin original Enables or disable debugging by setting the C<$Benchmark::Debug> flag: =end original C<$Benchmark::debug> フラグを設定することによって、デバッグを有効にしたり、 無効にしたりします: debug Benchmark 1; $t = timeit(10, ' 5 ** $Global '); debug Benchmark 0; =item iters =begin original Returns the number of iterations. =end original 繰り返し回数を返します。 =back =head2 Standard Exports (標準エクスポート) =begin original The following routines will be exported into your namespace if you use the Benchmark module: =end original 以下のルーチンは、Benchmark モジュールを使うときに、現在の名前空間へ エクスポートされます: =over 10 =item timeit(COUNT, CODE) =begin original 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. =end original 引数: COUNT は、ループの実行回数で、CODE は実行するコードです。 CODE は、コードリファレンスか eval される文字列のどちらかです; どちらの場合も呼び出し側のパッケージで実行されます。 =begin original Returns: a Benchmark object. =end original 返り値: Benchmark オブジェクトを返します。 =item timethis ( COUNT, CODE, [ TITLE, [ STYLE ]] ) =begin original 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 timestr() below. =end original CODE を COUNT 回繰り返した時間を計ります。 CODE は eval する文字列か、コードリファレンスです; どちらの場合でも CODE は呼び出し側のパッケージで実行されます。 結果は、TITLE に引き続いて時間、という形で STDOUT に出力されます。 TITLE が指定されない場合、デフォルトは "timethis COUNT" です。 STYLE は出力形式で、後述する timestr() に記述されています。 =begin original The COUNT can be zero or negative: this means the I to run. A zero signifies the default of 3 seconds. For example to run at least for 10 seconds: =end original COUNT はゼロや負数も指定できます: これは、実行する I を 意味します。 ゼロはデフォルトの 3 秒を意味します。 例えば、最低 10 秒実行するには: timethis(-10, $code) =begin original or to run two pieces of code tests for at least 3 seconds: =end original あるいは、2 つのコードの断片を最低 3 秒実行するには: timethese(0, { test1 => '...', test2 => '...'}) =begin original 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). =end original CPU 秒は UNIX 用語で、実(時計)時間や子プロセスで使われた時間ではなく、 プロセス自身のユーザー時間にシステム時間を加えたものです。 0.1 秒より小さい値は指定できません (例えば、もし COUNT として -0.01 を 指定すると、致命的ランタイム例外が発生します)。 =begin original Note that the CPU seconds is the B 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 C<$code> runs/second, which should be a more interesting number than the actually spent seconds. =end original CPU 秒は B<最低> 時間であることに注意してください: CPU スケジューリングと、その他の OS の要素がこの試みを 複雑にしているので、ほんのもう少し多くの時間が使われます。 しかし、ベンチマーク出力は C<$code> の 1 秒当たりの実行数を表示します; これは実際にかかった時間より興味深い数字のはずです。 =begin original Returns a Benchmark object. =end original Benchmark オブジェクトを返します。 =item timethese ( COUNT, CODEHASHREF, [ STYLE ] ) =begin original 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 =end original CODEHASHREF は、キーとして名前、値として eval する文字列かコードリファレンスを 含むハッシュへのリファレンスです。 CODEHASHREF のそれぞれの (KEY, VALUE) ペアについて、このルーチンが 呼び出されます timethis(COUNT, VALUE, KEY, STYLE) =begin original The routines are called in string comparison order of KEY. =end original このルーチンは KEY の文字列比較順で呼び出されます。 =begin original The COUNT can be zero or negative, see timethis(). =end original COUNT は 0 や負数になることがあります; timethis() を参照してください。 =begin original Returns a hash reference of Benchmark objects, keyed by name. =end original 名前をキーとした、Benchmark オブジェクトのハッシュリファレンスを返します。 =item timediff ( T1, T2 ) =begin original Returns the difference between two Benchmark times as a Benchmark object suitable for passing to timestr(). =end original 二つの Benchmark 時間の差を、timestr() に渡すのに適した Benchmark オブジェクトで返します。 =item timestr ( TIMEDIFF, [ STYLE, [ FORMAT ] ] ) =begin original 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 timediff(). =end original TIMEDIFF オブジェクトの時間を要求された STYLE で整形した 文字列を返します。 TIMEDIFF は timediff() で返されるのと同様の Benchmark オブジェクトであることを想定しています。 =begin original 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. =end original STYLE は 'all', 'none', 'noc', 'nop', 'auto' のいずれかです。 'all' は利用可能な五つの時間(「壁時計」時間、ユーザ時間、 システム時間、子プロセスのユーザ時間、子プロセスのシステム時間)を それぞれ表示します。 'noc' は二つの子プロセスの時間以外の全てを表示します。 'nop' は壁時計時間と二つの子プロセスの時間だけを表示します。 'auto' (これがデフォルトです) は、子プロセスの時間が両方とも 0 の場合は 'noc' として振る舞い、それ以外では 'all' として振る舞います。 'none' は何も出力しません。 =begin original FORMAT is the L-style format specifier (without the leading '%') to use to print the times. It defaults to '5.2f'. =end original FORMAT は、時間を表示するために使われる L-形式のフォーマット指定子 (先頭の '%' 抜き)です。 デフォルトは '5.2f' です。 =back =head2 Optional Exports (追加エクスポート) =begin original The following routines will be exported into your namespace if you specifically ask that they be imported: =end original 以下のルーチンは、明示的にインポートを要求することで、現在の名前空間へ エクスポートされます: =over 10 =item clearcache ( COUNT ) =begin original Clear the cached time for COUNT rounds of the null loop. =end original キャッシュされている、空ループを COUNT 回回した時間をクリアします。 =item clearallcache ( ) =begin original Clear all cached times. =end original 全てのキャッシュされた時間をクリアします。 =item cmpthese ( COUNT, CODEHASHREF, [ STYLE ] ) =item cmpthese ( RESULTSHASHREF, [ STYLE ] ) =begin original Optionally calls timethese(), then outputs comparison chart. This: =end original 状況に応じて timethese() を呼び出し、それから比較表を出力します。 これは: cmpthese( -1, { a => "++\$i", b => "\$i *= 2" } ) ; =begin original outputs a chart like: =end original 以下のような表を出力します: Rate b a b 2831802/s -- -61% a 7208959/s 155% -- =begin original This chart is sorted from slowest to fastest, and shows the percent speed difference between each pair of tests. =end original この表は遅いものから早いものの順にソートされ、それぞれのテスト間の 速度の差を百分率で表示します。 =begin original c can also be passed the data structure that timethese() returns: =end original C には timethese() が返すデータ構造体を渡すことも出来て: $results = timethese( -1, { a => "++\$i", b => "\$i *= 2" } ) ; cmpthese( $results ); =begin original 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. =end original 両方の結果セットを見たいときに使えます。 最初の引数が bless されていないハッシュリファレンスの場合、これは RESULTSHASHREF です; それ以外の場合はこれは COUNT です。 =begin original Returns a reference to an ARRAY of rows, each row is an ARRAY of cells from the above chart, including labels. This: =end original それぞれの行が上述の(ラベル込みの)セルの配列からなる、行の配列への リファレンスを返します。 こうすると: my $rows = cmpthese( -1, { a => '++$i', b => '$i *= 2' }, "none" ); =begin original returns a data structure like: =end original 以下のようなデータ構造を返します: [ [ '', 'Rate', 'b', 'a' ], [ 'b', '2885232/s', '--', '-59%' ], [ 'a', '7099126/s', '146%', '--' ], ] =begin original B: This result value differs from previous versions, which returned the C result structure. If you want that, just use the two statement C...C idiom shown above. =end original B<注意>: この結果値は、C の結果構造体を返していた 以前のバージョンとは異なります。 もしそれがほしいなら、上述した C...C の 2 文の 記述法を使ってください。 =begin original Incidently, 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. =end original 偶然ながら、二つの例における結果値の違いに注意してください; これは ベンチマークでは典型的です。 もしこれが実際のベンチマークなら、おそらくもっとたくさんの回数繰り返して 実行したいでしょう。 =item countit(TIME, CODE) =begin original 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. =end original 引数: TIME は CODE を実行するための最短時間で、CODE は実行するコードです。 CODE はコードリファレンスか、eval される文字列です; どちらの場合も 呼び出し元のパッケージで実行されます。 =begin original TIME is I negative. countit() 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. =end original TIME は負数では I<ありません> 。 countit() は、TIME のために実行する前に、CORE の速度を測るために 何度もループを実行します。 実際の実行時間は普通はシステムクロックの粒度のために TIME よりも 大きくなるので、単に繰り返し回数ではなく、繰り返し回数を関心のある 回数で割ったものを見るのが最良です。 =begin original Returns: a Benchmark object. =end original 返り値: Benchmark オブジェクトです。 =item disablecache ( ) =begin original Disable caching of timings for the null loop. This will force Benchmark to recalculate these timings for each new piece of code timed. =end original 空ループのための時間のキャッシュを無効にします。 これにより、Benchmark にコードの時間を計る毎に空ループの時間を 再計算することを強制します。 =item enablecache ( ) =begin original 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. =end original 空ループのための時間のキャッシュを有効にします。 異なる COUNT が使われる毎に 1 回だけ、COUNT 回の空ループの所要時間が 計算されます。 =item timesum ( T1, T2 ) =begin original Returns the sum of two Benchmark times as a Benchmark object suitable for passing to timestr(). =end original 二つの Benchmark 時間の和を、timestr() に渡すのに適した Benchmark オブジェクトで返します。 =back =head2 :hireswallclock =begin original If the Time::HiRes module has been installed, you can specify the special tag C<:hireswallclock> 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. =end original Time::HiRes モジュールがインストールされているなら、Benchmark のための 特別な C<:hireswallclock> タグを指定できます (もし Time::HiRes が 利用できないなら、このタグは暗黙に無視されます)。 このタグにより、壁時計時間は整数秒ではなく、マイクロ秒で計測されます。 しかし、速度計算は以前として壁時計時間ではなく CPU 時間によって 行われることに注意してください。 =head1 NOTES (注意) =begin original The data is stored as a list of values from the time and times functions: =end original データは、time 関数や times 関数による値のリストとして: ($real, $user, $system, $children_user, $children_system, $iters) =begin original in seconds for the whole loop (not divided by the number of rounds). =end original (各々の繰り返しごとではなく) ループ全体を秒数で計測して蓄えられます。 =begin original The timing is done using time(3) and times(3). =end original 計時は、time(3) と times(3) を使って行なわれます。 =begin original Code is executed in the caller's package. =end original コードは、呼び出し元のパッケージで実行されます。 =begin original 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. =end original 空ループ (繰り返し数は同じですが、空のループ) の時間が、実際のループの 時間から差し引かれます。 =begin original The null loop times can be cached, the key being the number of rounds. The caching can be controlled using calls like these: =end original 計算された空ループの実行時間は、繰り返しの数をキーとして、 キャッシュされます。 キャッシュ化は、以下のようなサブルーチンの呼び出しで制御できます: clearcache($key); clearallcache(); disablecache(); enablecache(); =begin original Caching is off by default, as it can (usually slightly) decrease accuracy and does not usually noticably affect runtimes. =end original キャッシュ化はデフォルトではオフです; これは(普通はわずかですが) 正確性を減少させ、普通はたいして実行時間に影響を与えないからです。 =head1 EXAMPLES (例) =begin original For example, =end original 例えば、 use Benchmark qw( cmpthese ) ; $x = 3; cmpthese( -5, { a => sub{$x*$x}, b => sub{$x**2}, } ); =begin original outputs something like this: =end original とすると、以下のようなものが出力されます: Benchmark: running a, b, each for at least 5 CPU seconds... Rate b a b 1559428/s -- -62% a 4152037/s 166% -- =begin original while =end original 一方 use Benchmark qw( timethese cmpthese ) ; $x = 3; $r = timethese( -5, { a => sub{$x*$x}, b => sub{$x**2}, } ); cmpthese $r; =begin original outputs something like this: =end original は以下のようなものが出力されます: 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% -- =head1 INHERITANCE (継承) =begin original Benchmark inherits from no other class, except of course for Exporter. =end original Benchmark は、Exporter からは当然継承を行なっていますが、その他の クラスからは継承を行ないません。 =head1 CAVEATS =begin original 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. =end original eval された文字列とコードリファレンスを比べると、不正確な結果となります; コードリファレンスは等価な eval された文字列よりも少し実行が遅いです。 =begin original The real time timing is done using time(2) and the granularity is therefore only one second. =end original 実際の時間の計測は、time(2) を使って行なわれるので、精度は 1 秒程度しかありません。 =begin original Short tests may produce negative figures because perl can appear to take longer to execute the empty loop than a short test; try: =end original perl では、空ループの方が短いテストよりも時間がかかる場合があるので、 短いテストでは、結果が負数になる場合があります; 以下のようにしてみてください: timethis(100,'1'); =begin original 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 E 0. =end original 空ループのシステム時間は、実際のコードを含むループのシステム時間よりも 多少多くかかることがあるため、最終的に差がゼロより小さくなることが あるのです。 =head1 SEE ALSO =begin original L - a Perl code profiler =end original L - a Perl コードプロファイラ =head1 AUTHORS Jarkko Hietaniemi >, Tim Bunce > =head1 MODIFICATION HISTORY September 8th, 1994; by Tim Bunce. March 28th, 1997; by Hugo van der Sanden: added support for code references and the already documented 'debug' method; revamped documentation. April 04-07th, 1997: by Jarkko Hietaniemi, added the run-for-some-time functionality. September, 1999; by Barrie Slaymaker: math fixes and accuracy and efficiency tweaks. Added cmpthese(). A result is now returned from timethese(). Exposed countit() (was runfor()). December, 2001; by Nicholas Clark: make timestr() 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. September, 2002; by Jarkko Hietaniemi: add ':hireswallclock' special tag. February, 2004; by Chia-liang Kao: make cmpthese and timestr use time statistics for children instead of parent when the style is 'nop'. November, 2007; by Christophe Grosjean: make cmpthese and timestr compute time consistently with style argument, default is 'all' not 'noc' any more. =begin meta Translate: 吉村 寿人 Update: Kentaro Shirakata (1.10) =end meta =cut