Benchmark-Perl-Formance-Plugin-Mandelbrot
view release on metacpan or search on metacpan
lib/Benchmark/Perl/Formance/Plugin/Mandelbrot/withthreads.pm view on Meta::CPAN
use Benchmark ':hireswallclock';
use constant ITER => 50;
use constant LIMITSQR => 2.0 ** 2;
use constant MAXPIXEL => 524288; # Maximum pixel buffer per thread
my ($w, $h);
my $threads;
# Generate pixel data for a single dot
sub dot($$) { ## no critic
my ($Zr, $Zi, $Tr, $Ti) = (0.0,0.0,0.0,0.0);
my $i = ITER;
my $Cr = 2 * $_[0] / $w - 1.5;
my $Ci = 2 * $_[1] / $h - 1.0;
(
$Zi = 2.0 * $Zr * $Zi + $Ci,
$Zr = $Tr - $Ti + $Cr,
$Ti = $Zi * $Zi,
$Tr = $Zr * $Zr
) until ($Tr + $Ti > LIMITSQR || !$i--);
return ($i == -1);
}
# Generate pixel data for range of lines, inclusive
sub lines($$) { ## no critic
map { my $y = $_;
pack 'B*', pack 'C*', map dot($_, $y), 0..$w-1;
} $_[0]..$_[1]
}
sub num_cpus {
open my $fh, '<', '/proc/cpuinfo' or return;
my $cpus;
while (<$fh>) {
$cpus ++ if /^processor[\s]+:/; # 0][]0]; # for emacs cperl-mode indent bug
( run in 0.266 second using v1.01-cache-2.11-cpan-65fba6d93b7 )