use strict; use threads; use Thread::Queue; use Time::HiRes 'time'; use constant MAXTHREADS => 2; my $workQueue = Thread::Queue->new(); my $outQueue = Thread::Queue->new(); my @filters; push @filters, sub { /blahdeblah/ ? 1 : undef } for 1..83; push @filters, sub { /active/ ? 1 : undef }; push @filters, sub { /anotherfilter/ ? 1 : undef }; my @threads = map { threads->new( \&worker ) } 1..MAXTHREADS; my $file_name = 'test.txt'; open my $DATF, '<', $file_name; while ( <$DATF> ) { $workQueue->enqueue($_); } close $DATF; $workQueue->end(); $_->join for @threads; $outQueue->end(); my @dat; while (my $line = $outQueue->dequeue()) { push @dat, $line; } print( time - $^T, "\n" ); sub worker { while ( my $line = $workQueue->dequeue() ) { chomp $line; foreach my $filter (@filters) { my $newline = $filter->($line) or next; $outQueue->enqueue($line); last; } } } #### use strict; use Time::HiRes 'time'; my (@dat) = (); my @filters; push @filters, sub { /blahdeblah/ ? 1 : undef } for 1..83; push @filters, sub { /active/ ? 1 : undef }; push @filters, sub { /anotherfilter/ ? 1 : undef }; my $file_name = 'test.txt'; open my $DATF, '<', $file_name; while( chomp(my $line = <$DATF>) ) { foreach my $filter (@filters) { my $newline = $filter->($line) or next; push (@dat, $line); last; } } close($DATF); print( time - $^T, "\n" ); #### active=sync|foo=bar=bam|sync=53|foo=bar=bam|sync=53|foo=bar=bam|sync=53| foo=bar=bam|sync=53||foo=bar=bam|sync=53 anotherfilter=forest|foo=bar=bam|sync=53|foo=bar=bam|sync=53|foo=bar=bam|sync=53|foo=bar=bam|sync=53|foo=bar=bam|sync=53