#! 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