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