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 )