带有strpos的str_replace?

时间:2011-10-14 22:36:44

标签: php str-replace micro-optimization strpos

使用 strpos 检查的 str_replace 功能可以避免额外的工作吗?

方法1

...
if (strpos($text, $tofind) !== FALSE)
 $text = str_replace($tofind, $newreplace, $text);
...

方法2

...
$text = str_replace($tofind, $newreplace, $text);
...

问题:这两种方法有效但...我想知道strpos-checking(或其他)是好方法还是坏方法,无用(和优化反模式)。

5 个答案:

答案 0 :(得分:4)

可以保存一些str_replace()来电,但您始终额外strpos() - 来电和!== false比较。但是,我不认为,只要此代码不会运行大约100000次(或类似),它将产生任何可测量的影响。 因此,只要您不需要知道, if 有替换,您应该避免这种“优化”,以使事情更简单和可读。

答案 1 :(得分:4)

你总是可以自己计时:

$start = 0; $end = 0;

$tofind = 'brown';

// A
$start = microtime(true);
for ($a=0; $a<1000; $a++) {
    if (strpos('The quick brown fox', $tofind) !== FALSE)
        str_replace($tofind, 'red', 'The quick brown fox');

}
$end = microtime(true);
echo $end - $start . "<br />\n";

// B
$start = microtime(true);
for ($b=0; $b<1000; $b++) {
    str_replace($tofind, 'red', 'The quick brown fox');
}
$end = microtime(true);
echo $end - $start . "<br />\n";

/*
various outputs:

0.0021979808807373
0.0013730525970459

0.0020320415496826
0.00130295753479

0.002094030380249
0.0013539791107178

0.0020980834960938
0.0013020038604736

0.0020389556884766
0.0012800693511963

0.0021991729736328
0.0013909339904785

0.0021369457244873
0.0012800693511963

*/

每次添加strpos都会变慢,但不会太多。

一个好的经验法则是不要猜测你的瓶颈在哪里。功能和良好,干净的设计代码。之后,当性能测试需要时,您可以配置文件

答案 2 :(得分:3)

没有strpos的方法更好。

让我们假设strpos和str_replace都具有相同的最坏情况运行时间,因为它们都必须遍历整个文本。

通过使用两者,在最坏的情况下,与仅使用str_replace相比,运行时间加倍。

答案 3 :(得分:0)

我刚刚测试了3种方法来替换配置文件中的常量:

// No check
function replaceConstantsNoCheck($value)
{
    foreach (array_keys(get_defined_constants()) as $constant)
        $value = str_replace($constant, constant($constant), $value);

    return $value;
}

// Check with strstr
function replaceConstantsStrstr($value)
{
    foreach (array_keys(get_defined_constants()) as $constant)
        if (strstr($value, $constant))
            $value = str_replace($constant, constant($constant), $value);

    return $value;
}

// Check with strpos
function replaceConstantsStrpos($value)
{
    foreach (array_keys(get_defined_constants()) as $constant)
        if (strpos($value, $constant) !== false)
            $value = str_replace($constant, constant($constant), $value);

    return $value;
}

一些测量:

/*
No check : 0.0078179836273193
Strstr   : 0.0034809112548828
Strpos   : 0.0034389495849609

No check : 0.0067379474639893
Strstr   : 0.0034348964691162
Strpos   : 0.0034480094909668

No check : 0.0064759254455566
Strstr   : 0.0031521320343018
Strpos   : 0.0032868385314941

No check : 0.0068850517272949
Strstr   : 0.003389835357666
Strpos   : 0.0031671524047852

No check : 0.006864070892334
Strstr   : 0.0032939910888672
Strpos   : 0.0032010078430176
*/

在我的所有测试中,没有任何检查方法使用至少两倍的时间!

似乎strstrstrpos方法之间没有显着差异。

答案 4 :(得分:0)

另一个基准测试结果如下:使用strpos:http://3v4l.org/pb4hY#v533没有strpos:http://3v4l.org/v35gT