#! perl -slw
use strict;
use vars qw[ $SIZE $N $CHUNK ];
$SIZE ||= 100_000;
$N ||= 30;
$CHUNK ||= 100;
srand( 1 );
sub getTopN {
my( $aref, $n ) = @_;
my @top = @{ $aref }[ 0 .. ( $n - 1) ];
for( my $p = $CHUNK; $p < @$aref; $p += $CHUNK ) {
my $end = $p + $CHUNK < @$aref ? $p + $CHUNK : $#{ $aref };
@top = (
sort{ $b <=> $a } @top, @{ $aref }[ $p .. $end ]
)[ 0 .. ( $n - 1 ) ];
}
return @top;
}
print scalar localtime;
my @numbers;
$#numbers = $SIZE;
$numbers[ $_ ] = int rand $SIZE for 0 .. $SIZE;
print scalar localtime;
print "@{[ getTopN( \@numbers, $N ) ]}";
print scalar localtime;
####
Array size | gen.(s) | sort(s)| sort(s) | sort(s) | sort(s)
| | (30) | (100) | (1000) | (10000)
-----------+---------+--------+---------+---------+-------
100_000 | 1 | 4 | 3 | 2 | 2
1_000_000 | 12 | 55 | 38 | 33 | 36
2_000_000 | 29 | 138 | 102 | 88 | 93
####
P:\test>294065 -SIZE=100000 -N=30 -CHUNK=30
Thu Sep 25 10:42:39 2003
Thu Sep 25 10:42:40 2003
99996 99996 99996 99996 99996 99996 99993 99993 99993 99990 99990 99990 99990 99987 99987 99987
Thu Sep 25 10:42:44 2003
P:\test>294065 -SIZE=100000 -N=30 -CHUNK=100
Thu Sep 25 10:42:55 2003
Thu Sep 25 10:42:56 2003
99996 99996 99996 99996 99996 99996 99993 99993 99993 99990 99990 99990 99990 99987 99987 99987
Thu Sep 25 10:42:59 2003
P:\test>294065 -SIZE=100000 -N=30 -CHUNK=1000
Thu Sep 25 10:43:14 2003
Thu Sep 25 10:43:15 2003
99996 99996 99996 99996 99996 99996 99993 99993 99993 99990 99990 99990 99990 99987 99987 99987
Thu Sep 25 10:43:17 2003
P:\test>294065 -SIZE=100000 -N=30 -CHUNK=10000
Thu Sep 25 10:43:29 2003
Thu Sep 25 10:43:30 2003
99996 99996 99996 99996 99996 99996 99993 99993 99993 99990 99990 99990 99990 99987 99987 99987
Thu Sep 25 10:43:32 2003
P:\test>294065 -SIZE=1000000 -N=30 -CHUNK=30
Thu Sep 25 10:43:48 2003
Thu Sep 25 10:44:00 2003
999969 999969 999969 999969 999969 999969 999969 999969 999969 999969 999969 999969 999969 99996
Thu Sep 25 10:44:55 2003
P:\test>294065 -SIZE=1000000 -N=30 -CHUNK=100
Thu Sep 25 10:45:13 2003
Thu Sep 25 10:45:25 2003
999969 999969 999969 999969 999969 999969 999969 999969 999969 999969 999969 999969 999969 99996
Thu Sep 25 10:46:03 2003
P:\test>294065 -SIZE=1000000 -N=30 -CHUNK=1000
Thu Sep 25 10:46:15 2003
Thu Sep 25 10:46:26 2003
999969 999969 999969 999969 999969 999969 999969 999969 999969 999969 999969 999969 999969 99996
Thu Sep 25 10:46:59 2003
P:\test>294065 -SIZE=1000000 -N=30 -CHUNK=10000
Thu Sep 25 10:47:20 2003
Thu Sep 25 10:47:31 2003
999969 999969 999969 999969 999969 999969 999969 999969 999969 999969 999969 999969 999969 99996
Thu Sep 25 10:48:07 2003
P:\test>294065 -SIZE=2000000 -N=30 -CHUNK=30
Thu Sep 25 10:48:43 2003
Thu Sep 25 10:49:12 2003
1999938 1999938 1999938 1999938 1999938 1999938 1999938 1999938 1999938 1999938 1999938 1999938
Thu Sep 25 10:51:30 2003
P:\test>294065 -SIZE=2000000 -N=30 -CHUNK=100
Thu Sep 25 11:08:59 2003
Thu Sep 25 11:09:29 2003
1999938 1999938 1999938 1999938 1999938 1999938 1999938 1999938 1999938 1999938 1999938 1999938 1999938 1999938 1999938 1999938 1999938
Thu Sep 25 11:11:11 2003P:\test>294065 -SIZE=2000000 -N=30 -CHUNK=1000
Thu Sep 25 10:52:14 2003
Thu Sep 25 10:52:42 2003
1999938 1999938 1999938 1999938 1999938 1999938 1999938 1999938 1999938 1999938 1999938 1999938
Thu Sep 25 10:54:10 2003
P:\test>294065 -SIZE=2000000 -N=30 -CHUNK=10000
Thu Sep 25 10:55:13 2003
Thu Sep 25 10:55:41 2003
1999938 1999938 1999938 1999938 1999938 1999938 1999938 1999938 1999938 1999938 1999938 1999938
Thu Sep 25 10:57:14 2003