Подтвердить что ты не робот

Что более эффективно, строковые функции PHP или регулярное выражение в PHP?

Я пишу PHP-код для синтаксического анализа строки. Это должно быть как можно быстрее, так и регулярные выражения? У меня есть подозрение, что строковые функции PHP стоят дороже, но это всего лишь предположение. Какая правда?

Вот конкретно, что мне нужно сделать со строкой:

Возьмите первую половину (на основе третьего местоположения подстроки "000000" ) и сравните ее хэш с последующими 20 байтами, выбросив все, что осталось.

Разберите 9-й байт через следующий "000000" как один фрагмент данных. Затем возьмите следующие 19 байт и разделите их на 8 (бросить 1) и 8. Затем я делаю некоторые другие вещи, которые преобразуют эти две 8-байтовые строки в даты.

Итак, что я должен делать.

4b9b3361

Ответ 1

Это зависит от вашего случая: если вы пытаетесь сделать что-то довольно простое (например: искать строку, заменять подстроку чем-то другим), то регулярные строковые функции - это путь. Если вы хотите сделать что-то более сложное (например: поиск IP-адресов), то функции Regex, безусловно, лучший выбор.

Я не профилировал регулярные выражения, поэтому не могу сказать, что они будут быстрее во время выполнения, но могу сказать, что дополнительное время, затрачиваемое на совместное использование эквивалента с использованием основных функций, не будет стоить того.


Изменить с помощью новой информации в OP:

Звучит так, как будто вам действительно нужно сделать несколько небольших строковых операций. Поскольку каждый из них индивидуально достаточно прост, и я сомневаюсь, что вы могли бы выполнить все эти шаги (или даже пару этих шагов) за один раз с помощью регулярного выражения, я бы воспользовался основными функциями:

Возьмите первую половину (на основе третьего местоположения подстроки "000000" ) и сравните ее хэш с последующими 20 байтами, выбросив все, что осталось.

Использование: strpos() и substr()
Или: /$(.*?0{6}.*?0{6}.*?)0{6}/

Затем возьмите следующие 19 байт и разделите их на 8 (бросок 1) и 8.

Использование: substr() - (я предполагаю, что вы имеете в виду 17 байт здесь - 8 + 1 + 8)

$part1 = substr($myStr, $currPos, 8);
$part2 = substr($myStr, $currPos + 9, 8);

Ответ 2

Я считаю, что существует порог, из которого регулярное выражение быстрее, чем куча вызовов строковых функций PHP. Во всяком случае, многое зависит от того, что вы делаете. Вы должны найти баланс.

Теперь вы отредактировали свой вопрос. Я бы использовал строковые функции для того, что вы пытаетесь выполнить. strpos() и substr() - это то, что приходит на ум с первого взгляда.

Ответ 3

Я думаю, что если вы хотите получить наивысшую производительность, вам следует избегать регулярных выражений, поскольку это помогает свести к минимуму усилия, но не будет иметь лучшую производительность, поскольку вы почти всегда можете настроить код с помощью строковых подпрограмм для конкретной проблемы и получить большую производительность из этого. Но для простых процедур синтаксического анализа, которые не могут быть оптимизированы, вы все равно можете использовать регулярное выражение, так как оно не будет иметь большого значения.

EDIT: для этой конкретной проблемы, которую вы опубликовали, я предпочитаю операции с строкой, но только потому, что не знаю, как это сделать в regex. Это, кажется, довольно прямолинейно, за исключением хеша, поэтому я думаю, что функции регулярных выражений/строк не будут иметь большого значения.

Ответ 4

Если то, что вы делаете, вообще разумно делать с использованием строковых функций, вы должны их использовать. Например, если вы определяете, существует ли постоянная строка 'abc' в $value, вы определенно хотите проверить strpos($value, 'abc') !== false, а не preg_match('/abc/', $value). Если вы обнаружите, что делаете много перетасовки строк и преобразований, чтобы выполнить то, что у вас было бы с регулярным выражением, вы почти наверняка завершаете разрушение производительности и ремонтопригодности.

Когда речь заходит о скорости, хотя, когда дело доходит до нее, не думайте об этом, часы ее. Команда time - ваш друг.

Ответ 5

В общем случае строковые функции быстрее, а функции регулярных выражений более гибкие.

Как и в любом другом случае, ваши результаты могут отличаться, единственный способ узнать наверняка - попробовать в обоих направлениях и в тестах.

Ответ 6

Я согласен со всеми: строковые функции немного более эффективны, чем функции регулярных выражений. Я просто хотел показать небольшое испытание, которое я сделал в терминале в качестве доказательства:

<сильные > StrPos():

$ time php -r '$i = 0; while($i++ < 1000000) strpos("abc", "a");'

real    0m0.380s
user    0m0.368s
sys    0m0.008s

preg_match():

$ time php -r '$i = 0; while($i++ < 1000000) preg_match("/abc/", "a");'

real    0m0.441s
user    0m0.432s
sys    0m0.004s

Ответ 7

Нативные строковые функции быстрее. Преимущество регулярного выражения состоит в том, что вы можете делать с ними что угодно.

Ответ 8

В зависимости от ваших потребностей. Большинство операций регулярного выражения работают быстрее, чем можно было бы подумать, и могут даже превосходить встроенные строковые функции в некоторых тривиальных операциях. Обратите внимание, что у меня есть библиотека preg, а не встроенная библиотека регулярных выражений, которая довольно медленная.