Привет!
Кто-то доказывал мне, что 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 пользуетесь вы?