Most efficient way to check if $string starts with $needle in perl
How important is this, really? I did a number of benchmarks, and the index
method averaged 0.68 microseconds per iteration; the regex method 1.14μs; the substr
method 0.16μs. Even my worst-case scenarios (2250-char strings that were equal), index
took 2.4μs, regex took 5.7μs, and substr
took 0.5μs.
My advice is to write a library routine:
sub begins_with
{
return substr($_[0], 0, length($_[1])) eq $_[1];
}
and focus your optimization efforts elsewhere.
UPDATE: Based on criticism of my "worst-case" scenario described above, I ran a new set of benchmarks with a 20,000-char randomly-generated string, comparing it against itself and against a string that differed only in the last byte.
For such long strings, the regex solution was by far the worst (a 20,000 character regex is hell): 105μs for the match success, 100μs for the match failure.
The index
and substr
solutions were still quite fast. index
was 11.83μs / 11.86μs for success/failure, and substr
was 4.09μs / 4.15μs. Moving the code to a separate function added about 0.222±0.05μs.
Benchmark code available at: http://codepaste.net/2k1y8e
I do not know the characteristics of @Stephane's data, but my advice stands.
rindex $string, $substring, 0
searches for $substring
in $string
at position <=0 which is only possible if $substring
is a prefix of $string
. Example:
> rindex "abc", "a", 0
0
> rindex "abc", "b", 0
-1