# Time::Stopwatch - phpMan

## NAME
    [Time::Stopwatch] - Use tied scalars as timers

## SYNOPSIS
        use [Time::Stopwatch];
        tie my $timer, '[Time::Stopwatch]';

        do_something();
        print "Did something in $timer seconds.\n";

        my @times = map {
            $timer = 0;
            do_something_else();
            $timer;
        } 1 .. 5;

## DESCRIPTION
    The [Time::Stopwatch] module provides a convenient interface to timing
    functions through tied scalars. From the point of view of the user,
    scalars tied to the module simply increase their value by one every
    second.

    Using the module should mostly be obvious from the synopsis. You can
    provide an initial value for the timers either by assigning to them or
    by passing the value as a third argument to tie().

    If you have the module [Time::HiRes] installed, the timers created by
    [Time::Stopwatch] will automatically count fractional seconds. Do *not*
    assume that the values of the timers are always integers. You may test
    the constant "[Time::Stopwatch::HIRES]" to find out whether high
    resolution timing is enabled.

  A note on timing short intervals
    [Time::Stopwatch] is primarily designed for timing moderately long
    intervals (i.e. several seconds), where the overhead imposed by the
    tie() interface does not matter. With [Time::HiRes] installed, it can
    nonetheless be used for even microsecond timing, provided that
    appropriate care is taken.

    *   Explicitly initialize the timer by assignment. The first measurement
        taken before resetting the timer will be a few microseconds longer
        due to the overhead of the tie() call.

    *   Always subtract the overhead of the timing code. This is true in
        general even if you're not using [Time::Stopwatch]. (High-level
        benchmarking tools like Benchmark.pm do this automatically.) See the
        code example below.

    *   Take as many measurements as you can to minimize random errors. The
        [Statistics::Descriptive] module may be useful for analyzing the data.
        This advice is also true for all benchmarking.

    *   Remember that a benchmark measures the time take to run the
        benchmark. Any generalizations to real applications may or may not
        be valid. If you want real world data, profile the real code in real
        use.

    The following sample code should give a relatively reasonable
    measurement of a the time taken by a short operation:

        use [Time::HiRes];  # high resolution timing required
        use [Time::Stopwatch];

        use [Statistics::Descriptive];
        my $stat = [Statistics::Descriptive::Sparse]->new();

        tie my $time, '[Time::Stopwatch]';  # code timer
        tie my $wait, '[Time::Stopwatch]';  # loop timer

        while ($wait < 60) {  # run for one minute
            my $diff = 0;
            $time = 0; do_whatever(); $diff += $time;
            $time = 0;                $diff -= $time;
            $stat->add_data($diff);
        }

        print("count: ", $stat->count(), " iterations\n",
              "mean:  ", $stat->mean(), " seconds\n",
              "s.d.:  ", $stat->standard_deviation(), " seconds\n");

    Note that the above code includes the time of the subroutine call in the
    measurement.

## BUGS
    Since tied scalars do not (yet?) support atomic modification, use of
    operators like "$t++" or "$t *= 2" on timers will cause them to lose the
    time it takes to fetch, modify and store the value. I *might* be able to
    get around this by overloading the return value of "FETCH", but I doubt
    if it's worth the trouble. Just don't do that.

    There is no way to force low-resolution timing if [Time::HiRes] has been
    installed. I'm not sure why anyone would want to, since int() will do
    just fine if you want whole seconds, but still..

## CHANGE LOG
    1.00 (15 Mar 2001)
        Explicitly localized $SIG{__DIE__} when testing for [Time::HiRes]
        availability. Added "A note on timing short intervals" to the POD
        documentation. Bumped version to 1, no longer beta.

    0.03 (27 Feb 2001)
        Modified tests to give more information, reduced subsecond accuracy
        test to 1/10 seconds to allow for inaccurate select()
        implementations. Tweaked synopsis and README.

## SEE ALSO
    [Time::HiRes], "tie" in perlfunc

    For a higher-level approach to timing, try (among others) the modules
    [Time::SoFar], [Devel::Timer], or Benchmark. Also see the profiling modules
    [Devel::DProf], [Devel::SmallProf] and [Devel::OpProf].

## AUTHORS
    Copyright 2000-2001, Ilmari Karonen. All rights reserved.

    This library is free software; you can redistribute it and/or modify it
    under the same terms as Perl itself.

    Address bug reports and comments to: <perl@itz.pp.sci.fi>

