Skip to content

Instantly share code, notes, and snippets.

@gbacon
Created May 21, 2012 20:13
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save gbacon/2764370 to your computer and use it in GitHub Desktop.
Save gbacon/2764370 to your computer and use it in GitHub Desktop.
#! /usr/bin/env perl
use strict;
use warnings;
use Benchmark;
sub arbitrary {
my @chars = ('A' .. 'Z', 'a' .. 'z', 0 .. 9);
my $str;
$str .= $chars[rand @chars] for 1 .. 20;
my($mm,$yy) = map sprintf("%02d", $_), 1 + rand 12, rand 100;
$str .= "-$mm$yy";
$str;
}
sub mmyy_sorter {
my $a_yy = substr($a, -2);
my $b_yy = substr($b, -2);
my $a_mm = substr($a, -4, 2);
my $b_mm = substr($b, -4, 2);
return ($a_yy cmp $a_yy) || ($a_mm cmp $b_mm);
}
my @array;
my @sizes = (
10, 20, 50, 100,
200, 500, 1_000,
10_000, 20_000, 50_000,
100_000, 200_000,
);
open my $out, ">", "sort.csv" or die "$0: open: $!";
select $out;
$| = 1;
select STDOUT;
foreach my $size (@sizes) {
my @input = map arbitrary, 1 .. $size;
my $n = $size <= 10_000 ? -1 : 4;
my %total;
for (1 .. 5) {
my $bench = timethese $n, {
alnitak => sub { @array = sort mmyy_sorter @input },
st_cmp => sub {
@array = map { $_->[0] }
sort { $a->[1] cmp $b->[1] || $a->[2] cmp $b->[2] }
map { /-(\d\d)(\d\d)/ ? [$_,$1,$2] : die "[$_]" }
@input;
},
st_ss => sub {
@array = map { $_->[0] }
sort { $a->[1] <=> $b->[1] || $a->[2] <=> $b->[2] }
map { /-(\d\d)(\d\d)/ ? [$_,$1,$2] : die "[$_]" }
@input;
},
uri => sub {
@array = map { substr $_, 4 }
sort
map { /-(\d\d)(\d\d)/ ? "$2$1$_" : die "[$_]" }
@input;
},
};
for (keys %$bench) {
my $iters = $bench->{$_}->iters;
$total{$_}{n} += $iters;
my(undef,$user,$sys) = @{ $bench->{$_} };
$total{$_}{t} += $user + $sys;
}
}
my @rates;
for (sort keys %total) {
push @rates, ($total{$_}{n} / $total{$_}{t});
}
$" = ",";
print $out "$size,@rates\n";
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment