#! perl -slw use strict; use threads; use threads::shared; use List::Util qw[ shuffle ]; use Time::HiRes qw[ time ]; our $N //= 1e3; our $W //= 20; our $L //= 1; my %counts :shared; sub worker { my @order = shuffle 1 .. 20; for( 1 .. $N ) { $L and lock %counts; ++$counts{ $_ } for @order; } } my $start = time; $_->join for map threads->new( \&worker ), 1 .. $W; my $end = time; for( sort{ $a <=> $b } keys %counts ) { printf "%2u : %u\n", $_, $counts{ $_ }; } printf "Took %.6f seconds\n", $end - $start; #### C:\test>junk2 -N=1000 -W=32 -L=1 1 : 32000 2 : 32000 3 : 32000 4 : 32000 5 : 32000 6 : 32000 7 : 32000 8 : 32000 9 : 32000 10 : 32000 11 : 32000 12 : 32000 13 : 32000 14 : 32000 15 : 32000 16 : 32000 17 : 32000 18 : 32000 19 : 32000 20 : 32000 Took 2.674634 seconds #### C:\test>junk2 -N=1000 -W=32 -L=0 1 : 25459 2 : 25272 3 : 25198 4 : 25176 5 : 25543 6 : 25338 7 : 25168 8 : 25261 9 : 25080 10 : 24649 11 : 24985 12 : 25527 13 : 25499 14 : 25351 15 : 25293 16 : 25337 17 : 25380 18 : 25224 19 : 25403 20 : 25123 Took 16.446213 seconds