Сосредоточение на запуске с, если вы уверены, что строки не пусты, добавление теста на первый символ, перед сравнением, strlen и т. Д., Немного ускоряет:
function startswith5b($haystack, $needle) {
return ($haystack{0}==$needle{0})?strncmp($haystack, $needle, strlen($needle)) === 0:FALSE;
}
Это как-то (20% -30%) быстрее. Добавление еще одного теста с символами, такого как $ haystack {1} === $ needle {1}, кажется, не сильно ускоряет, а может даже замедлять.
===
кажется быстрее, чем ==
Условный оператор (a)?b:c
кажется быстрее, чем if(a) b; else c;
Для тех, кто спрашивает "почему бы не использовать strpos?" называя другие решения "ненужной работой"
strpos быстрый, но он не подходит для этой работы.
Чтобы понять, вот небольшая симуляция в качестве примера:
Search a12345678c inside bcdefga12345678xbbbbb.....bbbbba12345678c
Что делает компьютер "изнутри"?
With strccmp, etc...
is a===b? NO
return false
With strpos
is a===b? NO -- iterating in haysack
is a===c? NO
is a===d? NO
....
is a===g? NO
is a===g? NO
is a===a? YES
is 1===1? YES -- iterating in needle
is 2===3? YES
is 4===4? YES
....
is 8===8? YES
is c===x? NO: oh God,
is a===1? NO -- iterating in haysack again
is a===2? NO
is a===3? NO
is a===4? NO
....
is a===x? NO
is a===b? NO
is a===b? NO
is a===b? NO
is a===b? NO
is a===b? NO
is a===b? NO
is a===b? NO
...
... may many times...
...
is a===b? NO
is a===a? YES -- iterating in needle again
is 1===1? YES
is 2===3? YES
is 4===4? YES
is 8===8? YES
is c===c? YES YES YES I have found the same string! yay!
was it at position 0? NOPE
What you mean NO? So the string I found is useless? YEs.
Damn.
return false
Предполагая, что strlen не выполняет итерацию всей строки (но даже в этом случае), это совсем не удобно.