#! perl -slw
use strict;
use threads;
use threads::shared;
use Thread::Semaphore;
use Math::BigInt;
use Time::HiRes qw[ time ];
use Data::Dump qw[ pp ];
use feature qw(say);
my %result : shared;
my $semaphore = Thread::Semaphore->new(4);
sub process {
my $number = shift;
my $factorial = factorial($number);
lock %result;
$result{$number} = $factorial->bsstr;
$semaphore->up;
}
sub factorial {
my $number = shift;
Math::BigInt->bfac($number);
}
my @numbers = ( 1000..2000 );
my $start = time;
my @threads = map {
$semaphore->down;
threads->create( \&process, $_ );
} @numbers;
$_->join for @threads;
my $end = time;
printf "Took %.6f seconds\n", $end - $start;
####
#! perl -slw
use strict;
use threads;
use threads::shared;
use Thread::Queue;
use Math::BigInt;
use Time::HiRes qw[ time ];
use Data::Dump qw[ pp ];
use feature qw(say);
my %result : shared;
sub process {
my $Q = shift;
while( my $number = $Q->dequeue ) {
my $factorial = factorial($number);
lock %result;
$result{$number} = $factorial->bstr;
}
}
sub factorial {
my $number = shift;
Math::BigInt->bfac($number);
}
my $start = time;
my $Q = new Thread::Queue;
$Q->enqueue( 1000..2000, (undef) x 4 );
my @threads = map { threads->create( \&process, $Q ); } 1 .. 4;
$_->join for @threads;
my $end = time;
printf "Took %.6f seconds\n", $end - $start;
##
##
#! perl -slw
use strict;
use Math::BigInt;
use Time::HiRes qw[ time ];
use feature qw(say);
my $start = time;
my $bn = Math::BigInt->bfac( 1000 );
my %result;
$result{ 1000 } = $bn->bstr;
for( 1001..2000 ) {
$bn *= $_;
$result{ $_ } = $bn->bstr;
}
my $end = time;
printf "Took %.6f seconds\n", $end - $start;