str_replace с помощью strpos? - PullRequest
       32

str_replace с помощью strpos?

4 голосов
/ 15 октября 2011

Функция str_replace с проверкой strpos может избежать дополнительной работы?

МЕТОД 1

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

МЕТОД 2

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

Вопрос: эти два метода работают, но ... я хочу знать, является ли проверка strpos (или другая) хорошим способом или плохой, бесполезной (и оптимизация antipattern).

Ответы [ 5 ]

4 голосов
/ 15 октября 2011

Вы можете сохранить некоторые str_replace() звонки, но вы получите всегда дополнительных strpos() -колоколов и !== false сравнений. Однако я не думаю, что это окажет какое-либо измеримое влияние, пока этот код не будет выполняться около 100000 раз (или около того). Таким образом, если вам не нужно знать, , если произведены замены, вам следует избегать этой "оптимизации", чтобы сделать вещи более простыми и удобочитаемыми.

4 голосов
/ 15 октября 2011

Вы всегда можете рассчитывать время самостоятельно:

$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 медленнее каждый раз, но ненамного.

Хорошее практическое правило - не угадывать, где будут ваши узкие места. Код для функциональности и хорошего, чистого дизайна. После этого вы можете профиль , если этого требуют тесты производительности.

3 голосов
/ 15 октября 2011

Лучше метод без strpos.

Предположим, что и strpos, и str_replace имеют одинаковое время выполнения в худшем случае, потому что им обоим приходится перебирать весь текст.

Используя оба, вы в худшем случае удваиваете время работы, чем просто использование одного str_replace.

0 голосов
/ 28 апреля 2014

Еще один результат теста здесь: с strpos: http://3v4l.org/pb4hY#v533 без strpos: http://3v4l.org/v35gT

0 голосов
/ 16 апреля 2012

Я только что протестировал 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 методами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...