Я критиковал ответ, который предложил preg_match over === при поиске смещений подстроки, чтобы избежать несоответствия типов.
Однако позже автор ответа обнаружил, что preg_match на самом деле значительно быстрее, чем многобайтовый режим работы mb_strpos. Обычный strpos быстрее, чем обе функции, но, конечно, не может иметь дело с многобайтовыми строками.
Я понимаю, что mb_strpos нужно сделать что-то большее, чем strpos. Однако, если регулярное выражение может сделать это почти так же быстро, как strpos, что это значит, что mb_strpos занимает так много времени?
У меня есть сильное подозрение, что это ошибка оптимизации. Могут ли, например, расширения PHP быть медленнее, чем его собственные функции?
mb_strpos($str, "颜色", 0 ,"GBK"): 15.988190889 (89%)
preg_match("/颜色/", $str): 1.022506952 (6%)
strpos($str, "dh"): 0.934401989 (5%)
Функции выполнялись 10 6 раз. Абсолютное время учитывает сумму времени 10 6 пробегов функции, а не среднее значение для одного.
Тестовая строка $str = "代码dhgd颜色代码";. Тест можно увидеть здесь (прокрутите вниз, чтобы пропустить класс тестирования).
Примечание.. По словам одного из комментаторов (и здравого смысла), preg_match также не использует многобайтов при сравнении, подвергая себя тому же риску ошибок, что и strpos.