У меня есть общая функция запроса к БД, которая запускает следующие проверки каждый раз при выполнении запроса SQL:
if (preg_match('~^(?:UPDATE|DELETE)~i', $query) === 1)
if (preg_match('~^(?:UPDATE|DELETE)~iS', $query) === 1)
if ((stripos($query, 'UPDATE') === 0) || (stripos($query, 'DELETE') === 0))
Я знаю, что простой strpos()
вызов намного быстрее, чем preg_match()
, однако, поскольку я звоню strIpos()
дважды , я действительно не уверен, какой из них должен работать лучше.
Модификатор S
во втором варианте также вносит некоторую путаницу в мою голову из руководства:
Когда будет использоваться шаблон
стоит потратить несколько раз
больше времени на его анализ, чтобы
ускорить время, необходимое для сопоставления.
Если этот модификатор установлен, то этот
проводится дополнительный анализ. В
настоящее, изучение шаблона полезно
только для не закрепленных шаблонов, которые делают
не имеют ни одного фиксированного пуска
характер.
В этом случае скорость не критична (в противном случае я бы не использовал эту универсальную функцию запроса), но я все же хотел бы, чтобы она работала как можно быстрее при сохранении ее простоты.
Какой из вышеперечисленных вариантов мне выбрать?
РЕДАКТИРОВАТЬ: Я запустить простой тест , и все же я не могу решить, какой метод работает лучше.
Вот результаты для 10 000 попыток (общее время, занятое в секундах):
Array
(
[match] => Array
(
[stripos] => 0.0965
[preg_match] => 0.2445
[preg_match?] => 0.1227
[preg_match?S] => 0.0863
)
[no-match] => Array
(
[stripos] => 0.1165
[preg_match] => 0.0812
[preg_match?] => 0.0809
[preg_match?S] => 0.0829
)
)
100 000 попыток :
Array
(
[match] => Array
(
[stripos] => 1.2049
[preg_match] => 1.5079
[preg_match?] => 1.5564
[preg_match?S] => 1.5857
)
[no-match] => Array
(
[stripos] => 1.4833
[preg_match] => 0.8853
[preg_match?] => 0.8645
[preg_match?S] => 0.8986
)
)
1 000 000 попыток :
Array
(
[match] => Array
(
[stripos] => 9.4555
[preg_match] => 8.7634
[preg_match?] => 9.0834
[preg_match?S] => 9.1629
)
[no-match] => Array
(
[stripos] => 13.4344
[preg_match] => 9.6041
[preg_match?] => 10.5849
[preg_match?S] => 8.8814
)
)
10 000 000 попыток :
Array
(
[match] => Array
(
[stripos] => 86.3218
[preg_match] => 93.6755
[preg_match?] => 92.0910
[preg_match?S] => 105.4128
)
[no-match] => Array
(
[stripos] => 150.9792
[preg_match] => 111.2088
[preg_match?] => 100.7903
[preg_match?S] => 88.1984
)
)
Как вы можете видеть, результаты сильно различаются, поэтому я задаюсь вопросом, является ли это правильным способом сделать тест.