#!/usr/local/bin/perl # Benchmark how fast we can do data-driven s///s use strict; use warnings; use Benchmark; my @pairs = qw/this=that foo=bar baz=quux 2+2=5/; my @names = split /\n/, 'this is not foo 2+2=4 baz(2+2) equals 5 the quick brown fox jumps over the lazy dog '; sub old { my $repeat = shift; my @newrecords; for(1..$repeat) { foreach my $name (@names) { for my $pair (@pairs) { my ($key,$value) = split (/=/, $pair); chomp ($value); $name =~s /\b\Q$key\E\b/$value/ig; # @newrecords = (@newrecords,"$name"); # too slow --ariels } push @newrecords, $name; } } @newrecords; } sub new { my $repeat = shift; # setup my @replacer = map { my ($key,$value) = split (/=/, $_); chomp($value); eval <<"END"; sub { \$_[0] =~ s/\\b\\Q$key\\E\\b/$value/ig; } END } @pairs; my @newrecords; for my $i (1..$repeat) { for my $name (@names) { for my $fn (@replacer) { $fn->($name); } push @newrecords, $name; } } @newrecords; } sub new2 { my $repeat = shift; # setup my @replacer = map { my ($key,$value) = split (/=/, $_); chomp($value); sub { $_[0] =~ s/\b$key\b/$value/igo } } @pairs; my @newrecords; for my $i (1..$repeat) { for my $name (@names) { for my $fn (@replacer) { $fn->($name); } push @newrecords, $name; } } @newrecords; } my (@old, @new, @new2); timethese(1, { old => '@old = old(100_000)', new => '@new = new(100_000)', new2 => '@new2 = new2(100_000)', }); print "Done\n"; # Ensure same results @old = old(10); @new = new(10); @new2 = new2(10); (@old == @new and ! grep { $old[$_] ne $new[$_] } 0..$#old) or die "Different:\nOLD: @old\nNEW: @new\n"; (@old == @new2 and ! grep { $old[$_] ne $new2[$_] } 0..$#old) or die "Different:\nOLD: @old\nNEW2: @new2\n";