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 )