#!/usr/bin/perl use strict; use warnings; use Benchmark 'cmpthese'; my @list; open (LIST, '<', 'list.rnd') or die "Unable to open list.rnd for reading : !"; while ( ) { chomp; push @list, $_; } my $length = int(rand 240) + 10; my $str_a = ""; $str_a .= ('a' .. 'z')[ rand 26] while length $str_a < $length; sub expensive_function { # my ($str_a, $str_b) = @_; # my $foo; # for ( split // , $str_a . $str_b) { # $foo++; # } } cmpthese -5, { 'tchn' => sub { use Inline C =>; for my $str_b ( @list ) { next if ! same_scan( $str_a, $str_b ); expensive_function ( $str_a, $str_b ); } }, 'LR' => sub { for my $str_b ( @list ) { next if index($str_a, substr($str_b, 0, 1)); expensive_function ( $str_a, $str_b ); } }, 'HB1' => sub { my ($a_1st, $rest) = split '', $str_a, 2; for my $str_b ( @list ) { my ($b_1st, $rest) = split '', $str_b, 2; next if $b_1st ne $a_1st; expensive_function ( $str_a, $str_b ); } }, 'HB2' => sub { my $rev_a = reverse $str_a; my $a_1st = chop $rev_a; for my $str_b ( @list ) { my $rev_b = reverse $str_b; my $b_1st = chop $rev_b; next if $b_1st ne $a_1st; expensive_function ( $str_a, $str_b ); } }, 'delim' => sub { my $fc = substr($str_a,0,1); for my $str_b ( @list ) { next if $str_b !~ /^$fc/; expensive_function ( $str_a, $str_b ); } }, 'tye1' => sub { for my $str_b ( @list ) { next if ord $str_a != ord $str_b; expensive_function ( $str_a, $str_b ); } }, 'tye2' => sub { my $fc = ord $str_a; for my $str_b ( @list ) { next if $fc != ord( $str_b ); expensive_function ( $str_a, $str_b ); } }, 'kval' => sub { my $fc = substr $str_a, 0, 1; for my $str_b ( @list ) { next if $fc ne substr $str_b, 0, 1; expensive_function ( $str_a, $str_b ); } }, }; __END__ __C__ int same_scan(char* str1, char* str2) { return str1[0] == str2[0] ? 1 : 0; }