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