Русскоязычный форум, посвященный фреймворку Kohana
http://forum.kohanaframework.su/

Скорость работы mb_* функций
http://forum.kohanaframework.su/viewtopic.php?f=23&t=769
Страница 1 из 1

Автор:  Sergey [ 18 ноя 2013, 17:07 ]
Заголовок сообщения:  Скорость работы mb_* функций

Привет!

Кто-то доказывал мне, что mb_detect_encoding, работает в разы быстрее своих конкурентов.
Сделал простой тест. Прогнал строку через функцию 1000000 раз. Посмотрел кто быстрее.
Проверял на машине с таким окружением: Windows 7 (x64) + Apache 2.4.x (x64) + php 5.5.6 (x64)

В качестве строки использовал:

Код:
    $string "ывлдоkfdsuLIU(*knj4k58u7MJHKkiyhsf9hfhlknhlkjldfivjo8iulkjlgs".
              
"2345678901234567890123456789012345678901234567890123456789012".
              
"ыдваолт ДЛЯОЧДльы0щ39478509г0*()*?Щчялртодылматцю4к 2ылвсголо".
              
"4567890123456789012345678901234567890123456789012345678901234".
              
"4567890123456789012345678901234567890123456789012345678901234".
              
"asdfsd ds.kjasldasjlKUJLjLKZjulizL kzjxLkUJOLIULKM.LKl;.mcvss"


Проверял так:

Код:
    $s microtime(true);

    for (
$i=0$i<1000000$i++)
    {
            
// Алгоритм проверки
    
}

    
$e microtime(true);

    echo 
$e-$s


И вот, что у меня вышло:

11.634791135788 секунд
Код:
preg_match('//u', $string ) 


Fatal error: Maximum execution time of 30 seconds exceeded
Код:
(preg_match('%^(?>
                [\x09\x0A\x0D\x20-\x7E]              # ASCII
                | [\xC2-\xDF][\x80-\xBF]             # non-overlong 2-byte
                |  \xE0[\xA0-\xBF][\x80-\xBF]        # excluding overlongs
                | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}  # straight 3-byte
                |  \xED[\x80-\x9F][\x80-\xBF]        # excluding surrogates
                |  \xF0[\x90-\xBF][\x80-\xBF]{2}     # planes 1-3
                | [\xF1-\xF3][\x80-\xBF]{3}          # planes 4-15
                |  \xF4[\x80-\x8F][\x80-\xBF]{2}     # plane 16
            )*$%xs'
, $string) 

Этот алгоритм проверки рекомендует W3C. Кстати, хочу заметить, что атомарная группировка (?: под Windows окружением у меня не работает. Т.е. браузер пишет - "Ошибка, страница не найдена" :) Логи сервера и php пусты, а браузер не может открыть страницу. А вот, (?> работает и в Linux окружении и в Windows. Честно говоря не совсем понятно, с чем это связанно. То ли из-за сборки php, то ли из-за странных конфигов php, но я вроде бы всё проверил и не нашёл причину такого странного поведения.

12.27244400978 секунд
Код:
preg_match('/^./su'$string


15.370143890381 секунд
Код:
mb_detect_encoding($string, array('UTF-8'), true


23.193331956863 секунд
Код:
preg_match('//u'serialize($string)) 


А каким методом для определения UTF-8 пользуетесь вы?

Автор:  WinterSilence [ 19 ноя 2013, 22:10 ]
Заголовок сообщения:  Re: Скорость работы mb_* функций

Fatal error: Maximum execution time of 30 seconds exceeded - а ты бери не весь документ, а лишь часть. обычно в таких случаях я смотрю комменты на php.com к описанию функций - для mb_detect_encoding приводится несколько альтернативных вариантов.

Автор:  Sergey [ 20 ноя 2013, 01:00 ]
Заголовок сообщения:  Re: Скорость работы mb_* функций

А я и брал не весь документ, а конкретную строку, которую указал в самом начале и с ней и игрался. Каждый конкретный случай проверял отдельно

Автор:  WinterSilence [ 20 ноя 2013, 02:48 ]
Заголовок сообщения:  Re: Скорость работы mb_* функций

Насчет строки затупил =\ вообще конечно странно как получилось превышение, я конечно помню, что preg_* ф-ции ресурсоёмкие, но чтобы настолько...
Кстати попробуй что-то вроде:
Код:
<?php $utf8 = (md5(iconv('utf-8', 'utf-8', $string)) == md5($string)); ?> 

Автор:  Sergey [ 21 ноя 2013, 05:48 ]
Заголовок сообщения:  Re: Скорость работы mb_* функций

Ага, я в курсе.
Не стал пробовать пробовать по двум причинам: 1) iconv вообще не совсем стандартное решение, оно как бы на shared хостингах отключено, а у меня была цель использовать что нибудь более менее универсальное. 2) В общем то я видел как парни из Kohana Team отказывались от iconv из-за ресурсоёмкости

Страница 1 из 1 Часовой пояс: UTC + 4 часа [ Летнее время ]
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/