use strict;
use warnings;
use 5.020;
use PDL;
use PDL::IO::Image;
use PDL::Image2D;
use PDL::IO::FastRaw;
use Encode qw/ decode /;
my $img = PDL::IO::Image-> new_from_file( 'test.png' );
my $pdl = $img-> pixels_to_pdl-> short;
my $s1 = cc8compt( $pdl == 0 )-> byte;
my $s2 = cc8compt( $pdl == 0 );
say 'Equal' if decode( 'UTF16LE', ${ $s2-> get_dataref }) eq
${ $s1-> get_dataref };
writefraw( $s1, "fname-1" );
writefraw( $s2, "fname-2" );
####
use strict;
use warnings;
use 5.020;
use threads;
use Encode qw/ decode /;
say "No thread (byte)\n---------";
say 'Count: ', scalar @{ test( 1 )};
say "\nThread (byte)\n---------";
say 'Count: ', scalar @{ threads-> create( \&test, 1 )-> join };
say "\nNo thread (short)\n---------";
say 'Count: ', scalar @{ test( 2 )};
say "\nThread (short)\n---------";
say 'Count: ', scalar @{ threads-> create( \&test, 2 )-> join };
sub test {
my $arg = shift;
open my $fh, '<', "fname-$arg";
binmode $fh;
my $str = do { local $/; <$fh> };
close $fh;
$str = decode( 'UTF16LE', $str ) if $arg == 2;
my ( $w, $h ) = ( 7616, 1200 );
my @b = map {
[ [ $w, 0 ], [ $h, 0 ] ]
} 0 .. 145;
my $t = time;
for my $y ( 0 .. $h - 1 ) {
my $s = substr( $str, $y * $w, $w );
while( $s =~ m[[^\0]+]g ) {
my $c = ord( $& );
$b[ $c ][ 0 ][ 0 ] = $-[0] if $-[0] < $b[ $c ][ 0 ][ 0 ];
$b[ $c ][ 0 ][ 1 ] = $+[0] - 1 if $+[0] - 1 > $b[ $c ][ 0 ][ 1 ];
$b[ $c ][ 1 ][ 0 ] = $y if $y < $b[ $c ][ 1 ][ 0 ];
$b[ $c ][ 1 ][ 1 ] = $y if $y > $b[ $c ][ 1 ][ 1 ];
}
}
say 'Time: ', time - $t;
shift @b;
return \@b;
}
##
##
No thread (byte)
---------
Time: 0
Count: 145
Thread (byte)
---------
Time: 1
Count: 145
No thread (short)
---------
Time: 1
Count: 145
Thread (short)
---------
Time: 51
Count: 145