I want to test the performance of two different approaches, in perl, of checking that one string is contained entirely within another.
The first approach is to take a string convert it to an array and test character by character whilst the second approach simply evaluates a regular expression (which I believe has the same order as a linear search through all the characters but doesn't incur the cost of assigning memory for an array, and copying characters into it (though it might have other costs involved)).
My initial approach to doing this test was to just stick both procedures (see below) in a big for loop (0 to 999999) and then time how long it takes for the program to finish; and at first it looked as though a regex match was much faster (12.926s vs 0.318s); but I then considered the possibility that upon evaluating the regex once the following iterations are trivial because it is cached. To test this I instead put my for loop on the command line (making each iteration of the perl script looping through 0 to 0 "memory-less") and noticed that they are both similar (albeit with some wild divergence from the average at times). But I strongly suspect this might be a poor conclusion because the time taken to start the script probably dominates the execution time of the script.
Is there a way (especially for when I want to look at something less trivial), of turning off the caching (if that's what is happening of course) so that I can fairly run procedures within a for loop (so I can call the script only once)?
Or is it the case that there is nothing clever going on and that a regex search really is much quicker in this example!?
my $teststr = "testing testing";
my $teststr2 = "testing tasted";
my $match = 1;
#procedure one - character by character checking
for (my $i = 0; $i < 1; $i++)
{
my @chrArr = split //, $teststr;
my @chrArr2 = split //, $teststr2;
for (my $j = 0; $j < @chrArr2; $j++)
{
if($chrArr[$j] != $chrArr2[$j])
{
$match = 0;
break;
}
}
}
#procedure 2 - regex matching
for (my $i = 0; $i < 1; $i++)
{
if($teststr !~ m/$teststr2/)
{
$match = 0;
}
}