#! perl -sw
use strict;
use threads;
use Thread::Queue;
use Time::HiRes qw[ time ];
sub worker {
my $Q = shift;
while( my $line = $Q->dequeue ) {
$line =~ s[a][A]g;
print $line;
}
}
print "Started " . scalar locatime;
our $T //= 4;
my $n = $T -1;
my @Qs = map Thread::Queue->new, 0 .. $n;
my @threads = map{
threads->create( \&worker, $Qs[ $_ ] )
} 0 .. $n;
my $start = time;
my $i = 0;
while( <> ) {
$Qs[ $i ]->enqueue( $_ );
$i = ( $i + 1 ) % $T;
warn $., ' ', $. / ( time - $start ) unless $. % 1e6;
}
$Qs[ $_ ]->enqueue( undef ) for 0 .. $n;
$_->join for @threads;
print "Ended " . scalar locatime;
####
perl -e"printf qq[line %6d:the quick brown fox jumps over the lazy dog\n], $_ for 1 .. 1e6" >phrases.small
C:\test>dir phrases.small
...
23/03/2011 03:19 57,000,000 phrases.small
...
####
C:\test>junk71 -T=1 phrases.small >out.txt
Started Wed Mar 23 03:19:58 2011
1000000 19484.8213140505 at C:\test\junk71.pl line 30, <> line 1000000.
Ended Wed Mar 23 03:20:51 2011
C:\test>junk71 -T=2 phrases.small >out.txt
Started Wed Mar 23 03:20:59 2011
1000000 18001.4760827208 at C:\test\junk71.pl line 30, <> line 1000000.
Ended Wed Mar 23 03:21:55 2011
C:\test>junk71 -T=3 phrases.small >out.txt
Started Wed Mar 23 03:27:32 2011
1000000 15906.3434420465 at C:\test\junk71.pl line 30, <> line 1000000.
Ended Wed Mar 23 03:28:35 2011
C:\test>junk71 -T=4 phrases.small >out.txt
Started Wed Mar 23 03:30:32 2011
1000000 15088.645826608 at C:\test\junk71.pl line 30, <> line 1000000.
Ended Wed Mar 23 03:31:38 2011
####
perl -MTime::HiRes=time
-E"BEGIN{warn $t=time, }"
-pe"s[a][A]g; }{ warn $./(time-$t); warn time"
phrases.small >out.txt
1300851145.745 at -e line 1.
977517.104726817 at -e line 2, <> line 1000000.
1300851146.77491 at -e line 2, <> line 1000000.