App-numspeed
view release on metacpan or search on metacpan
bin/numspeed view on Meta::CPAN
#!perl
our $DATE = '2016-10-01'; # DATE
our $VERSION = '0.001'; # VERSION
use strict;
use warnings;
no warnings 'numeric';
use Getopt::Long::Complete;
use Time::HiRes qw(time);
my %Opts = (
si => 0,
);
sub _with_unit {
my ($n2, $n1, $t2, $t1) = @_;
if ($t2 == $t1) {
return (0, "");
} else {
my $s = ($n2-$n1) / ($t2-$t1);
if ($Opts{si}) {
if ($s > 1.5e9) {
return ($s/1e9, "Gi/s");
} elsif ($s > 1.5e6) {
return ($s/1e6, "Mi/s");
} elsif ($s > 1.5e3) {
return ($s/1e6, "Ki/s");
} else {
return ($s, "/s");
}
} else {
if ($s > 1.5*2**30) {
return ($s/2**30, "G/s");
} elsif ($s > 1.5*2**20) {
return ($s/2**20, "M/s");
} elsif ($s > 1.5*2**10) {
return ($s/2**10, "K/s");
} else {
return ($s, "/s");
}
}
}
}
sub parse_cmdline {
my $res = GetOptions(
'si!' => \$Opts{si},
'version|v' => sub {
no warnings;
print "linespeed version $main::VERSION ($main::DATE)\n";
exit 0;
},
'help|h' => sub {
print <<USAGE;
Usage:
linespeed [OPTIONS]... < INPUT
linespeed --version, -v
linespeed --help, -h
Options:
For more details, see the manpage/documentation.
USAGE
exit 0;
},
);
exit 99 if !$res;
}
sub run {
$|++;
my $num = 0;
my $prev_time = time();
my $prev_num;
my ($first_num, $first_time);
my $msg = "";
while (<>) {
($num) = /^\s*([+-]?\d+(?:\.\d+)?)/ or last;
my $time = time();
unless (defined $prev_num) {
$prev_num = $num;
$prev_time = time();
$first_num = $num;
$first_time = $prev_time;
next;
}
# don't report speed too often
next unless $time - $prev_time >= 0.5;
my $new_msg = sprintf(
"Cur speed: %8.3f%-4s Avg: %8.3f%-4s",
_with_unit($num, $prev_num , $time, $prev_time ),
_with_unit($num, $first_num, $time, $first_time),
);
print "\b" x length $msg;
print $new_msg, "\e[K"; # clear to EOL
$msg = $new_msg;
$prev_num = $num;
$prev_time = $time;
}
}
# MAIN
parse_cmdline();
run();
1;
# ABSTRACT: Calculate how fast a number is changing
# PODNAME: numspeed
__END__
( run in 1.808 second using v1.01-cache-2.11-cpan-437f7b0c052 )