Якщо зосередитись на startwith, якщо ви впевнені, що рядки не порожні, додавання тесту на перший знак, перед порівнянням, strlen тощо, трохи прискорює:
function startswith5b($haystack, $needle) {
return ($haystack{0}==$needle{0})?strncmp($haystack, $needle, strlen($needle)) === 0:FALSE;
}
Це якось (на 20% -30%) швидше. Якщо додати ще один тест, наприклад, $ стог сіна {1} === $ голка {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 не повторює весь рядок (але навіть у цьому випадку), це зовсім не зручно.