Я пишу PHP-код для синтаксического анализа строки. Это должно быть как можно быстрее, так и регулярные выражения? У меня есть подозрение, что строковые функции PHP стоят дороже, но это всего лишь предположение. Какая правда?
Вот конкретно, что мне нужно сделать со строкой:
Возьмите первую половину (на основе третьего местоположения подстроки «000000») и сравните ее хэш с последующими 20 байтами, выбросив все, что осталось.
Разберите 9-й байт через следующий «000000» как один фрагмент данных. Затем возьмите следующие 19 байт и разделите их на 8 (бросок 1) и 8. Затем я сделаю еще кое-что, что преобразует эти две 8-байтовые строки в даты.
Так вот что я должен делать.
Это зависит от вашего случая: если вы пытаетесь сделать что-то довольно простое (например: искать строку, заменять подстроку чем-то другим), то обычные функции строк – это путь. Если вы хотите сделать что-то более сложное (например: поиск 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);
Я думаю, что если вы хотите получить максимальную производительность, вам следует избегать регулярных выражений, поскольку это помогает свести к минимуму усилия, но не будет иметь лучшую производительность, так как вы почти всегда можете настроить код с помощью строковых подпрограмм на определенную проблему и получить большой прирост производительности. Но для простых подпрограмм синтаксического анализа, которые не могут быть оптимизированы, вы все равно можете использовать регулярное выражение, так как оно не будет иметь большого значения.
EDIT: для этой конкретной проблемы, которую вы опубликовали, я предпочитаю операции с строкой, но только потому, что не знаю, как это сделать в regex. Это, кажется, довольно прямолинейно, за исключением хеша, поэтому я думаю, что функции регулярных выражений / строк не будут иметь большого значения.
Я считаю, что есть порог, из которого регулярное выражение быстрее, чем куча вызовов строковых функций PHP. Во всяком случае, многое зависит от того, что вы делаете. Вы должны найти баланс.
Теперь, когда вы отредактировали свой вопрос. Я бы использовал строковые функции для того, что вы пытаетесь выполнить. strpos () и substr () – это то, что приходит на ум с первого взгляда.
В общем случае строковые функции быстрее, а функции регулярных выражений более гибкие.
Как и в любом другом случае, ваши результаты могут отличаться, единственный способ узнать наверняка – попробовать в обоих направлениях и в бенчмарке.
Если то, что вы делаете, вообще разумно делать с помощью строковых функций, вы должны их использовать. Например, если вы определяете, существует ли постоянная строка 'abc'
в $value
, вы определенно хотите проверить strpos($value, 'abc') !== false
, а не preg_match('/abc/', $value)
, Если вы обнаружите, что делаете много перетасовки строк и преобразований, чтобы выполнить то, что у вас было бы с регулярным выражением, вы почти наверняка завершаете разрушение производительности и ремонтопригодности.
Однако, когда речь заходит о скорости, когда дело доходит до нее, не думайте об этом, часы ее. Команда time
– ваш друг.
Я согласен со всеми: строковые функции немного более эффективны, чем функции регулярных выражений. Я просто хотел показать небольшой тест, который я сделал в терминале в качестве доказательства:
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
Родные строковые функции быстрее. Преимущество регулярного выражения заключается в том, что вы можете делать с ними что угодно.
Зависит от ваших потребностей. Большинство операций регулярного выражения работают быстрее, чем можно было бы подумать, и могут даже превосходить встроенные строковые функции в некоторых тривиальных операциях. Обратите внимание, что у меня есть библиотека preg, а не встроенная библиотека регулярных выражений, которая довольно медленная.