#! 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.