Пару недель назад, мне кто-то доказывал, что mb_detect_encoding, работает в разы быстрее своих надуманных конкурентов. Задача простая, проверить входящую строку на принадлежность к UTF-8. Логика простая, либо UTF-8, либо нет. В повседневной жизни, обычно не приходится выбирать из зоопарка кодировок и, чаще всего, строка либо в utf8, либо в cp1251.
Сделал простой синтетический тест. Прогнал определение через функцию 10000 раз. Посмотрел кто быстрее.
Вариант 1, который мне нравится:
$s = microtime(true);
for( $i=0; $i<10000; $i++ )
{
$string = 'sdf;gklaj;skdjf;sdkfls;dfjk';
if( preg_match('//u', $string ) )
{
}
}
$e = microtime(true);
echo "\n\n" . $e-$s;
Средний результат выполнения скрипта на моей машине ~0.020 сек. Сравнивал я его с более правильным решением, которое выглядит так:
$s = microtime(true);
for( $i=0; $i<10000; $i++ )
{
$string = 'sdf;gklaj;skdjf;sdkfls;dfjk';
mb_detect_encoding( $string, array('UTF-8'), true );
}
$e = microtime(true);
echo "\n\n" . $e-$s;
Средний результат выполнения скрипта на моей машине ~0.050 сек. После этих тестов, решил прогнать на больших объемах данных, сгенерировал текст размером 10к байт и пропустил через функции. Для preg_match время выполнения составило ~0.120 сек, для mb_detect_encoding ~0.7 сек. Из этих изысканий можно сделать вывод, что определение через preg_match работает в разы быстрее чем стандартные механизмы, но, вероятно, проигрывает в количестве доступых фич.
На самом деле, есть еще три миллиона разных способов решить эту задачу, расскажите чем пользуетесь вы?