Форум dkLab и Denwer
Здесь общаются Web-разработчики.
Генеральный спонсор:
Хостинг «Джино»

разница в скорости работы strtr и str_replace (Миша Спларов)
Author Message
Maus
Модератор



Joined: 29 Jun 2003
Posts: 8151
Карма: 271
   поощрить/наказать

Location: пос. Омсукчан Магаданской области

PostPosted: Sat Jul 24, 2010 12:27 pm ()
   Post subject:
Reply with quote


М

Выделено из темы «покритикуйте плиз обработчик текста»,
расположенной в форуме Разное :: PHP (24 Августа 2010, 02:15).
Back to top
View user's profile Send private message
Миша Спларов
Участник форума



Joined: 17 Nov 2003
Posts: 821
Карма: 65
   поощрить/наказать

Location: Россия, Москва

PostPosted: Sat Jul 24, 2010 12:27 pm (спустя 1 секунду; написано за 52 секунды)
   Post subject:
Reply with quote

На счёт str_replace и strtr (xpoint.ru/forums/programming/PHP/thread/20999.xhtml), которую я посоветовал.
Back to top
View user's profile Send private message
Maus
Модератор



Joined: 29 Jun 2003
Posts: 8151
Карма: 271
   поощрить/наказать

Location: пос. Омсукчан Магаданской области

PostPosted: Sun Jul 25, 2010 1:59 pm (спустя 1 день 1 час 32 минуты; написано за 2 минуты 29 секунд)
   Post subject:
Reply with quote

Миша Спларов
Ух, 6.5 лет теме! как Вы её нашли?
Буду иметь в виду, но за это время в движке PHP могло что-то поменяться...

[offtopic]Эх, раньше люди за ответами сами лазили в исходники PHP, а сегодня не знают, что в браузере набрать. Регресс..[/offtopic]
Back to top
View user's profile Send private message
Миша Спларов
Участник форума



Joined: 17 Nov 2003
Posts: 821
Карма: 65
   поощрить/наказать

Location: Россия, Москва

PostPosted: Mon Jul 26, 2010 6:12 am (спустя 16 часов 12 минут; написано за 24 секунды)
   Post subject:
Reply with quote

На пхпклабе была ссылка на lib.custis.ru/PHP-разгон:_серебряная_пуля_из_автомата_Комменца-Вальтера»_%28Commentz-Walter%29, а там на тему Дмитрия на икспоинте.
Back to top
View user's profile Send private message
Maus
Модератор



Joined: 29 Jun 2003
Posts: 8151
Карма: 271
   поощрить/наказать

Location: пос. Омсукчан Магаданской области

PostPosted: Mon Jul 26, 2010 10:07 pm (спустя 15 часов 54 минуты; написано за 16 секунд)
   Post subject:
Reply with quote

исправленная ссылка (lib.custis.ru/PHP-%D1%80%D0%B0%D0%B7%D0%B3%D0%BE%D0%BD:_%D1%81%D0%B5%D1%80%D0%B5%D0%B1%D1%80%D1%8F%D0%BD%D0%B0%D1%8F_%D0%BF%D1%83%D0%BB%D1%8F_%D0%B8%D0%B7_%D0%B0%D0%B2%D1%82%D0%BE%D0%BC%D0%B0%D1%82%D0%B0_%D0%9A%D0%BE%D0%BC%D0%BC%D0%B5%D0%BD%D1%86%D0%B0-%D0%92%D0%B0%D0%BB%D1%8C%D1%82%D0%B5%D1%80%D0%B0%C2%BB_%28Commentz-Walter%29)
Back to top
View user's profile Send private message
Maus
Модератор



Joined: 29 Jun 2003
Posts: 8151
Карма: 271
   поощрить/наказать

Location: пос. Омсукчан Магаданской области

PostPosted: Tue Aug 24, 2010 1:28 am (спустя 28 дней 3 часа 21 минуту; написано за 6 минут 28 секунд)
   Post subject:
Reply with quote

на хабре опубликовали материал про телефонные номера (habrahabr.ru/blogs/php/102352/) , ну я из любопытства решил сравнить. Конкретно для данной задачи полное соответствие со статьей с Кустиса: strtr был быстрее в ~15 раз.

код:
Code (php): скопировать код в буфер обмена
function habred( $phone )
{
    static (www.php.net/static) $replace = array (www.php.net/array)('2'=>array('a','b','c'),
        '3'=>array('d','e','f'),
        '4'=>array('g','h','i'),
        '5'=>array('j','k','l'),
        '6'=>array('m','n','o'),
        '7'=>array('p','q','r','s'),
        '8'=>array('t','u','v'),
        '9'=>array('w','x','y','z'));
 
    foreach($replace as $digit=>$letters) {
        $phone = str_ireplace($letters, $digit, $phone);
    }
    return $phone;
}

function habredMass( &$phones )
{
    static (www.php.net/static) $matches = array (www.php.net/array)(
        'a','b','c', 'd','e','f',
        'g','h','i', 'j','k','l',
        'm','n','o', 'p','q','r','s',
        't','u','v', 'w','x','y','z', );
    static (www.php.net/static) $replaces = array (www.php.net/array)(
        '2', '2', '2', '3', '3', '3',
        '4', '4', '4', '5', '5', '5',
        '6', '6', '6', '7', '7', '7', '7',
        '8', '8', '8', '9', '9', '9', '9', );
 
    $phones = str_ireplace($matches, $replaces, $phones);
}


function tracedA( $phone )
{
    static (www.php.net/static) $pairs = array (www.php.net/array)(
        'a' => 2, 'b' => 2, 'c' => 2,
        'd' => 3, 'e' => 3, 'f' => 3,
        'g' => 4, 'h' => 4, 'i' => 4,
        'j' => 5, 'k' => 5, 'l' => 5,
        'm' => 6, 'n' => 6, 'o' => 6,
        'p' => 7, 'q' => 7, 'r' => 7, 's' => 7,
        't' => 8, 'u' => 8, 'v' => 8,
        'w' => 9, 'x' => 9, 'y' => 9, 'z' => 9,
    );
   
    return strtr (www.php.net/strtr)($phone, $pairs);
}

function tracedL( $phone )
{
    static (www.php.net/static) $s = 'abcdefghijklmnopqrstuvwxyz';
    static (www.php.net/static) $n = '22233344455566677778889999';
   
    return strtr (www.php.net/strtr)($phone, $s, $n);
}
function reversedTracedL( $phone )
{
    static (www.php.net/static) $s = 'abcdefghijklmnopqrstuvwxyz';
    static (www.php.net/static) $n = '22233344455566677778889999';
   
    return strtr (www.php.net/strtr)($phone, $n, $s);
}


// готовим данные. 22Мб памяти ест.
$phonesN = range (www.php.net/range)(5222222, 5499999);

$phonesL = array (www.php.net/array)();
foreach($phonesN as $phone)
{
    $phonesL[] = reversedTracedL($phone);
}
$start = microtime (www.php.net/microtime)(true);
$phonesN2  = array (www.php.net/array)();
foreach($phonesL as $phone)
{
    $phonesN2[] = habred($phone);
}
echo (www.php.net/echo) "habred: ", round (www.php.net/round)( microtime (www.php.net/microtime)(true) - $start, 4), "\n";

$start = microtime (www.php.net/microtime)(true);
$phonesN2  = array (www.php.net/array)();
foreach($phonesL as $phone)
{
    $phonesN2[] = tracedL($phone);
}
echo (www.php.net/echo) "tracedL: ", round (www.php.net/round)( microtime (www.php.net/microtime)(true) - $start, 4), "\n";

$start = microtime (www.php.net/microtime)(true);
$phonesN2  = array (www.php.net/array)();
foreach($phonesL as $phone)
{
    $phonesN2[] = tracedA($phone);
}
echo (www.php.net/echo) "tracedA: ", round (www.php.net/round)( microtime (www.php.net/microtime)(true) - $start, 4), "\n";

$phonesN2  = $phonesL;
$start = microtime (www.php.net/microtime)(true);
habredMass($phonesN2);
echo (www.php.net/echo) "habredMass: ", round (www.php.net/round)( microtime (www.php.net/microtime)(true) - $start, 4), "\n";
результат прогона (их было насколько, но особых отклонений нет):
Quote:
habred: 12.2406
tracedL: 0.8306
tracedA: 2.9149
habredMass: 6.4867
интересно, что трансляция по буквам оказалась втрое быстрее, чем по массиву пар.
habredMass() - это я заодно убедился, что при наличии массива самому оббегать его через foreach() вредно, надо скармливать его str_replace() целиком.
Back to top
View user's profile Send private message
Rin
Участник форума



Joined: 01 Jun 2005
Posts: 515
Карма: 185
   поощрить/наказать

Location: Москва

PostPosted: Tue Sep 07, 2010 11:08 pm (спустя 14 дней 21 час 39 минут; написано за 23 секунды)
   Post subject:
Reply with quote

Почему у Вас str_ireplace вместо str_replace?
Back to top
View user's profile Send private message Send e-mail
Maus
Модератор



Joined: 29 Jun 2003
Posts: 8151
Карма: 271
   поощрить/наказать

Location: пос. Омсукчан Магаданской области

PostPosted: Thu Sep 09, 2010 1:44 pm (спустя 1 день 14 часов 35 минут; написано за 1 минуту 8 секунд)
   Post subject:
Reply with quote

Rin
Видимо, потому что так было в оригинале, плюс
Quote:
1-800-Petmeds
Back to top
View user's profile Send private message
Rin
Участник форума



Joined: 01 Jun 2005
Posts: 515
Карма: 185
   поощрить/наказать

Location: Москва

PostPosted: Fri Sep 10, 2010 12:17 pm (спустя 22 часа 32 минуты; написано за 4 минуты)
   Post subject:
Reply with quote

Тогда массивы/строки для strtr() нужно дополнить заглавными буквами, чтобы сравнение производительности было более точным.
Возможно, лучшим вариантом будет использование str_replace() вместо str_ireplace() и обработка через strtolower() перед заменой во всех тестах.
Back to top
View user's profile Send private message Send e-mail
Maus
Модератор



Joined: 29 Jun 2003
Posts: 8151
Карма: 271
   поощрить/наказать

Location: пос. Омсукчан Магаданской области

PostPosted: Fri Sep 10, 2010 1:38 pm (спустя 1 час 21 минуту; написано за 20 секунд)
   Post subject:
Reply with quote

Rin
Если желаете - займитесь :)
Back to top
View user's profile Send private message
Rin
Участник форума



Joined: 01 Jun 2005
Posts: 515
Карма: 185
   поощрить/наказать

Location: Москва

PostPosted: Sun Sep 12, 2010 11:27 pm (спустя 2 дня 9 часов 49 минут; написано за 58 секунд)
   Post subject:
Reply with quote

Мои замеры:

Оригинальный тест

habred: 7.504
tracedL: 0.4657
tracedA: 1.7861
habredMass: 3.9661


str_replace() вместо str_ireplace()

habred: 4.5764
tracedL: 0.4658
tracedA: 1.7872
habredMass: 1.0259
Back to top
View user's profile Send private message Send e-mail
Display posts from previous:   
Post new topic   Reply to topic All times are GMT + 3 Hours
Page 1 of 1    Email to a Friend.
You cannot post new topics in this forum. You cannot reply to topics in this forum. You cannot edit your posts in this forum. You cannot delete your posts in this forum. You cannot vote in polls in this forum. You cannot attach files in this forum. You can download files in this forum.
XML