#!/usr/bin/perl -s use strict; use warnings; use Benchmark 'cmpthese'; our $N ||= 100_000; my @list; open (LIST, '<', 'list.rnd') or die "Unable to open list.rnd for reading : !"; while ( ) { chomp; push @list, $_; } my %lookup; 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++; # } $_[ 2 ]++ } our( $buk, $tchn, $lr, $hb1, $hb2, $delim, $tye1, $tye2, $kval ) = (0)x10; cmpthese $N, { 'BUK' => sub { unless( keys %lookup ) { push @{ $lookup{ chr ord } }, $_ for @list; } expensive_function( $str_a, $_, $buk ) for @{ $lookup{ chr ord $str_a }; } }, 'tchn' => sub { use Inline C =>; for my $str_b ( @list ) { next if ! same_scan( $str_a, $str_b ); expensive_function ( $str_a, $str_b, $tchn ); } }, 'LR' => sub { for my $str_b ( @list ) { next if index($str_a, substr($str_b, 0, 1)); expensive_function ( $str_a, $str_b, $lr ); } }, '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, $hb1 ); } }, '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, $hb2 ); } }, '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, $delim ); } }, 'tye1' => sub { for my $str_b ( @list ) { next if ord $str_a != ord $str_b; expensive_function ( $str_a, $str_b, $tye1 ); } }, 'tye2' => sub { my $fc = ord $str_a; for my $str_b ( @list ) { next if $fc != ord( $str_b ); expensive_function ( $str_a, $str_b, $tye2 ); } }, '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, $kval ); } }, }; $,= ' - '; print $buk, $tchn, $lr, $hb1, $hb2, $delim, $tye1, $tye2, $kval; __END__ __C__ int same_scan(char* str1, char* str2) { return str1[0] == str2[0] ? 1 : 0; }