use Inline C; use POSIX qw( strncmp ); use Benchmark qw( cmpthese ); use strict; use warnings; my $n = 36; my @nums = 0 .. 99_999; my @str = map join('', 'a' .. 'z'), @nums; no warnings qw/ uninitialized void /; cmpthese(-10, { strncmp => sub { for(@nums) { strncmp_perl(@str[$_,$_ + 1], $n); } }, eq_substr => sub { for(@nums) { substr($str[$_], 0, $n) eq substr($str[$_ + 1], 0, $n) } }, eq_unpack => sub { for(@nums) { unpack("A$n", $str[$_]) eq unpack("A$n", $str[$_ + 1]) } }, }); __END__ __C__ int strncmp_perl(char* s1, char* s2, int n) { return strncmp(s1, s2, (int)n); } __output__ Benchmark: running eq_substr, eq_unpack, strncmp, each for at least 10 CPU seconds... eq_substr: 11 wallclock secs (10.11 usr + 0.01 sys = 10.12 CPU) @ 5.34/s (n=54) eq_unpack: 11 wallclock secs (10.16 usr + 0.00 sys = 10.16 CPU) @ 2.07/s (n=21) strncmp: 11 wallclock secs (10.04 usr + 0.00 sys = 10.04 CPU) @ 5.88/s (n=59) Rate eq_unpack eq_substr strncmp eq_unpack 2.07/s -- -61% -65% eq_substr 5.34/s 158% -- -9% strncmp 5.88/s 184% 10% --