使用 strpos 检查的 str_replace 功能可以避免额外的工作吗?
方法1
...
if (strpos($text, $tofind) !== FALSE)
$text = str_replace($tofind, $newreplace, $text);
...
方法2
...
$text = str_replace($tofind, $newreplace, $text);
...
问题:这两种方法有效但...我想知道strpos-checking(或其他)是好方法还是坏方法,无用(和优化反模式)。
答案 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
*/
在我的所有测试中,没有任何检查方法使用至少两倍的时间!
似乎strstr
和strpos
方法之间没有显着差异。
答案 4 :(得分:0)
另一个基准测试结果如下:使用strpos:http://3v4l.org/pb4hY#v533没有strpos:http://3v4l.org/v35gT