I did try cmpthese but I got error messages about the input file and it wouldn't run. My code:
#!/usr/bin/perl
use strict;
use warnings;
use Benchmark 'cmpthese';
use Time::HiRes qw/tv_interval gettimeofday/;
#https://perlmonks.org/index.pl?node_id=11164097
open my $fh, '<', 'try3.txt' or die $!; # try3.txt contains the origin
+al data
my $s;
{
local $/ = undef; #local $/ = '', is paragraph mode
$s = <$fh>; # slurp file
}
$s = $s x 10_000; # 90_000 lines (30_000 records)
close $fh or die $!;
sub GRT {
my $s = shift;
map { unpack q{x4a*}, $_ }
sort
map {
m{(\d+)(?=%)}
&&
( ~ pack( q{N}, $1 ) . pack( q{a*}, $_ ) )
}
do {
#local $/ = q{}; # $s is slurped before passing to split functi
+on
split m{(?<!\A)(?=>>>)}, $s;
}
}
sub ST {
my $s = shift;
map {$_->[0]}
sort {$b->[1] <=> $a->[1]}
map {[$_, /(\d+)%/]} split(/^(?=>>> )/m, $s)
}
my $t0;
my $elapsed;
$t0 = [gettimeofday];
GRT($s);
$elapsed = tv_interval ( $t0, [gettimeofday]);
print "GRT time: ", $elapsed, "\n";
$t0 = [gettimeofday];
ST($s);
$elapsed = tv_interval ( $t0, [gettimeofday]);
print "ST time: ", $elapsed;
=begin
C:\Old_Data\perlp>perl GRT_ST_transform.pl
GRT time: 0.222224
ST time: 0.05873
C:\Old_Data\perlp>
=cut
#cmpthese( -1, { 'a' => GRT($s), 'b' => ST($s) } ) ;
The input file was the 9 lines (that I expanded to 90_000 lines for the test):
>>> prd1701
Filesystem Size Used Avail Use% Moun
+ted on
/workspace 3.9T 887G 3.0T 13% /wor
+kspace/data
>>> prd1702
Filesystem Size Used Avail Use% Moun
+ted on
/workspace 3.9T 746G 3.1T 23% /wor
+kspace/data
>>> prd1703
Filesystem Size Used Avail Use% Moun
+ted on
/workspace 3.9T 687G 3.2T 18% /wor
+kspace/data
|