## With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, tutorials, and more.

No credit card required

# High-Resolution Timers

## Problem

You need to measure time with a finer granularity than the full seconds that `time` returns.

## Solution

This might not be possible. If your system supports both the `syscall` function in Perl as well as a system call like `gettimeofday`(2), then you could possibly use them to measure the time. The procedure for using `syscall` varies from system to system. The Discussion has sample code using it, but this is not necessarily portable.

The Time::HiRes module (available from CPAN) encapsulates this functionality for some systems:

```use Time::HiRes qw(gettimeofday);
\$t0 = gettimeofday;
\$t1 = gettimeofday;
\$elapsed = \$t1-\$t0;
# \$elapsed is a floating point value, representing number
# of seconds between \$t0 and \$t1```

## Discussion

Here’s some code that uses Time::HiRes to time how long the user takes to press RETURN:

```use Time::HiRes qw(gettimeofday);
print "Press return when ready: ";
\$before = gettimeofday;
\$line = <>;
\$elapsed = gettimeofday-\$before;
print "You took \$elapsed seconds.\n";

`Press return when ready: `

`You took 0.228149 seconds.````

Compare this to the equivalent `syscall` code:

`require 'sys/syscall.ph'; # initialize the structures returned by gettimeofday \$TIMEVAL_T = "LL"; \$done = \$start = pack(\$TIMEVAL_T, ()); # prompt print "Press return when ready: "; # read the time into \$start syscall(&SYS_gettimeofday, \$start, 0) != -1 || die "gettimeofday: \$!"; # read a line \$line = <>; # read the time into \$done syscall(&SYS_gettimeofday, \$done, 0) ...`

## With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, interactive tutorials, and more.

No credit card required