use Benchmark qw(cmpthese); sub rbyte { int rand 256 } my @unsorted; for (1..10000) { push @unsorted, join '.', rbyte, rbyte, rbyte, rbyte } sub sort_by_ip_address { return sort { pack("C4",split(/\./,$a)) cmp pack("C4",split(/\./,$b)) } @_ } sub sort_faster { return map {$_->[1]} sort {$a->[0] cmp $b->[0]} map {[(pack('C4',split(/\./,$_))), $_]} @_ } my @sorted; cmpthese( 10, { ' slow' => sub { @sorted = sort_by_ip_address(@unsorted) }, 'faster' => sub { @sorted = sort_faster(@unsorted) }, }); __END__ $ perl fastip.pl Benchmark: timing 10 iterations of slow, faster... slow: 80 wallclock secs (40.79 usr + 0.00 sys = 40.79 CPU) @ 0.25/s (n=10) faster: 15 wallclock secs ( 6.95 usr + 0.06 sys = 7.01 CPU) @ 1.43/s (n=10) s/iter slow faster slow 4.08 -- -83% faster 0.701 482% --