4

strposチェックを備えたstr_replace関数は、余分な作業を回避できますか?

方法1

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

方法2

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

質問:この2つの方法は機能しますが、... strpos-checking(またはその他)が良い方法なのか、悪い、役に立たない(そして最適化のアンチパターン)のかを知りたいです。

4

5 に答える 5

4

一部の呼び出しを保存することもできますが、常に追加の呼び出しと比較が行われます。ただし、このコードが約100000回(またはそのような)実行されない限り、測定可能な影響はないと思います。したがって、知る必要がない限り、置き換えが行われる場合は、この「最適化」を避けて、物事をより単純で読みやすくする必要があります。str_replace()strpos()!== false

于 2011-10-14T22:44:04.980 に答える
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は毎回遅くなりますが、それほどではありません。

経験則として、ボトルネックがどこにあるかを推測しないでください。機能性と優れたクリーンなデザインのコード。その後、パフォーマンステストで必要な場合にプロファイルを作成できます。

于 2011-10-14T22:49:53.970 に答える
3

strposを使用しない方法の方が優れています。

strposとstr_replaceの両方がテキスト全体を反復処理する必要があるため、実行時間が同じワーストケースであると想定します。

両方を使用すると、最悪の場合、str_replaceを単独で使用する場合よりも実行時間が2倍になります。

于 2011-10-14T22:43:49.770 に答える
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
*/

私のすべてのテストで、少なくとも2倍の時間を使用したチェック方法はありませんでした。

strstrstrposメソッドの間に大きな違いはないようです。

于 2012-04-16T13:33:40.303 に答える
0

ここでの別のベンチマーク結果:strposあり:http: //3v4l.org/pb4hY#v533 strposなし:http://3v4l.org/v35gT

于 2014-04-28T12:17:45.207 に答える