#!/usr/bin/perl -I. -w # # I've been told at times that this or that sort function is # faster for sorting IP addresses. I've decied that I won't # accept undocumented claims anymore. # # This file provides a way to test out sort functions. If you # think you've got a faster one, please try re-defining &mysortfunc. # If it's faster, let me know. If it's not, don't. # sub mysortfunc { return sort { pack("C4",split(/\./,$a)) cmp pack("C4",split(/\./,$b)) } @_ } BEGIN { unless (-t STDOUT) { print "1..0 # Skipped: this is for people looking for faster sorts\n"; exit(0); } } use Net::Netmask; use Net::Netmask qw(sameblock cmpblocks); use Carp; use Carp qw(verbose); use Benchmark qw(cmpthese); sub generate { my $count = shift || 10000; my @list; $list[$count-1]=''; ## preallocate for (my $i=0; $i<$count; $i++) { my $class = int(rand(3)); if ($class == 0) { ## class A ( 1.0.0.0 - 126.255.255.255 ) $list[$i] = int(rand(126))+1; } elsif ($class == 1) { ## class B ( 128.0.0.0 - 191.255.255.255 ) $list[$i] = int(rand(64))+128; } else { ## class C ( 192.0.0.0 - 223.255.255.255 ) $list[$i] = int(rand(32))+192; } $list[$i] .= '.' . int(rand(256)); $list[$i] .= '.' . int(rand(256)); $list[$i] .= '.' . int(rand(256)); } return @list; } my (@iplist) = generate(500); cmpthese (-1, { candidate => sub { my (@x) = mysortfunc(@iplist); }, distributed => sub { my (@x) = sort_by_ip_address(@iplist); }, });