App-linespeed
view release on metacpan or search on metacpan
script/linespeed view on Meta::CPAN
#!perl
our $DATE = '2020-05-04'; # DATE
our $VERSION = '0.003'; # VERSION
use strict;
use warnings;
use Getopt::Long::Complete;
use Time::HiRes qw(time);
my %Opts = (
);
sub _with_unit {
no warnings 'uninitialized';
my ($n2, $n1, $t2, $t1) = @_;
if ($t2 == $t1) {
return (0, "");
} else {
my $s = ($n2-$n1) / ($t2-$t1);
if ($s > 1.5e9) {
return ($s/1e9, "Gi/s");
} elsif ($s > 1.5e6) {
return ($s/1e6, "Mi/s");
} elsif ($s > 1.5e3) {
return ($s/1e3, "Ki/s");
} else {
return ($s, "/s");
}
}
}
sub parse_cmdline {
my $res = GetOptions(
'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_lines = 0;
my $prev_time = time();
my $prev_num_lines;
my ($first_num_lines, $first_time);
my $msg = "";
my $time;
my $code_report = sub {
my $new_msg = sprintf(
"Cur speed: %8.3f%-4s Avg: %8.3f%-4s Lines: %-8d",
_with_unit($num_lines, $prev_num_lines , $time, $prev_time ),
_with_unit($num_lines, $first_num_lines, $time, $first_time),
$num_lines,
);
print "\b" x length $msg;
print $new_msg, "\e[K"; # clear to EOL
$msg = $new_msg;
};
while (<>) {
$num_lines++;
$time = time();
unless (defined $prev_num_lines) {
$prev_num_lines = $num_lines;
$prev_time = time();
$first_num_lines = $num_lines;
$first_time = $prev_time;
next;
}
# don't report speed too often
next unless $time - $prev_time >= 0.5;
$code_report->();
$prev_num_lines = $num_lines;
$prev_time = $time;
}
$code_report->();
print "\n";
}
( run in 1.576 second using v1.01-cache-2.11-cpan-13bb782fe5a )