update page now
Longhorn PHP 2026 - Call For Papers

Voting

: min(three, four)?
(Example: nine)

The Note You're Voting On

samy
9 years ago
I just want to highlight that (at least on php7), when testing for the existence of a string in the beginning of another string you should consider using substr  or strpos (if performances is an issue).

Here is a small benchmark (for what it's worth):
<?php
$n = 'abcd';
$l = strlen($n);
$haystack0 = base64_encode(random_bytes(128));

//heat
$r = 1;
for ($i = 0; $i < 100000000; $i++)
    $r += $r * $r % 10000;

//tests
$k = 30000000;
$res = array();
foreach (array('found' => $n . $haystack0, 'not-found' => strrev($n) . $haystack0) as $f => $haystack) {
    $m = microtime(true);
    for ($i = 0; $i < $k; $i++)
        !strncmp($haystack, $n, $l) && $r++;
    $res["strncmp-$f"] = -$m + ($m = microtime(true));

    for ($i = 0; $i < $k; $i++)
        (strpos($haystack, $n) === 0) && $r++;
    $res["strpos-$f"] = -$m + ($m = microtime(true));

    for ($i = 0; $i < $k; $i++)
        (substr($haystack, 0, $l) === $n) && $r++;
    $res["substr-$f"] = microtime(true) - $m;
}

//print
asort($res);
print_r($res);
echo "\n$r"; // makes sure no auto-optimization occurs
?>

This outputs:
<?php /*
    [strpos-found]        => 1.3313138484955
    [substr-not-found]    => 1.4832630157471
    [substr-found]        => 1.6976611614227
    [strpos-not-found]    => 2.0043320655823
    [strncmp-not-found]    => 2.0969619750977
    [strncmp-found]        => 2.3616981506348
*/ ?>

<< Back to user notes page

To Top