Я критиковал ответ, который предложил 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
.