[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[bug#60807] [PATCH 1/2] mtime: use Time::HiRes::stat when available for
From: |
Mike Frysinger |
Subject: |
[bug#60807] [PATCH 1/2] mtime: use Time::HiRes::stat when available for subsecond resolution |
Date: |
Sun, 15 Jan 2023 03:26:04 -0500 |
On 14 Jan 2023 21:27, Jacob Bachmeyer wrote:
> Mike Frysinger wrote:
> > --- a/lib/Automake/FileUtils.pm
> > +++ b/lib/Automake/FileUtils.pm
> > @@ -42,6 +42,11 @@ use Exporter;
> > use File::stat;
> > use IO::File;
> >
> > +# Perl's builtin stat does not provide sub-second resolution. Use
> > Time::HiRes
> > +# if it's available instead. Hopefully one day perl will update.
> > +# https://github.com/Perl/perl5/issues/17900
> > +my $have_time_hires = eval { require Time::HiRes; };
> > +
> > use Automake::Channels;
> > use Automake::ChannelDefs;
> >
> > @@ -115,10 +120,18 @@ sub mtime ($)
> > return 0
> > if $file eq '-' || ! -f $file;
> >
> > - my $stat = stat ($file)
> > - or fatal "cannot stat $file: $!";
> > -
> > - return $stat->mtime;
> > + if ($have_time_hires)
> > + {
> > + my @stat = Time::HiRes::stat ($file)
> > + or fatal "cannot stat $file: $!";
> > + return $stat[9];
> > + }
> > + else
> > + {
> > + my $stat = stat ($file)
> > + or fatal "cannot stat $file: $!";
> > + return $stat->mtime;
> > + }
> > }
>
> If you change that variable to a constant, you can eliminate the runtime
> overhead entirely, since Perl optimizes if(1) and if(0) and folds
> constants at compile time.
>
> Something like:
>
> use constant HAVE_Time_HiRes => eval { require Time::HiRes; };
>
> Then:
>
> if (HAVE_Time_HiRes)
> ...
>
> If you do this, Perl will inline the block actually used and elide the
> branch at runtime. This is generally useful for any test that can only
> go one way in a specific run of the program.
thanks, i'll integrate that idea. i'm by no means a perl programmer.
-mike
signature.asc
Description: PGP signature
- [bug#60808] [PATCH 2/2] tests: reuse am_cv_filesystem_timestamp_resolution, (continued)