sub ordinate ($) { my $num = shift; $num =~ s/(\d*(11|12|13|4|5|6|7|8|9|0))$/$1th/ or $num =~ s/(\d*(1))$/$1st/ or $num =~ s/(\d*(2))$/$1nd/ or $num =~ s/(\d*(3))$/$1rd/; return $num; } #### Rate Ordinate Method 3 Method 4 Method 2 Method 1 Ordinate 125/s -- -48% -50% -54% -64% Method 3 242/s 93% -- -4% -11% -30% Method 4 252/s 102% 5% -- -7% -27% Method 2 272/s 117% 13% 8% -- -21% Method 1 344/s 175% 42% 36% 27% -- #### #!/usr/bin/perl -w use strict; use Benchmark qw(:all :hireswallclock); cmpthese( 2000, { 'Method 1' => 'for (0..300) { my $ord = method_1($_) }', 'Method 2' => 'for (0..300) { my $ord = method_2($_) }', 'Method 3' => 'for (0..300) { my $ord = method_3($_) }', 'Method 4' => 'for (0..300) { my $ord = method_4($_) }', 'Ordinate' => 'for (0..300) { my $ord = ordinate($_) }', }); sub ordinate { my $num = shift; $num =~ s/(\d*(11|12|13|4|5|6|7|8|9|0))$/$1th/ or $num =~ s/(\d*(1))$/$1st/ or $num =~ s/(\d*(2))$/$1nd/ or $num =~ s/(\d*(3))$/$1rd/; return $num; } sub method_1 { my $suffix; my $nouser = shift; if ($nouser =~ /(?