Я действительно поражен функциональностью GREP в оболочке, раньше я использовал метод подстроки в java, но теперь я использую для него GREP, и он выполняется за считанные секунды, он невероятно быстрее, чем код Java, который я писал. (по моему опыту я могу ошибаться)
При этом я не мог понять, как это происходит? в сети также мало что доступно.
Кто-нибудь может мне с этим помочь?
Ответы:
Предполагая, что ваш вопрос касается
GNU grep
конкретно. Вот заметка автора Майка Хэртела:Этот ответ является частью информации, взятой отсюда .
источник
Чтобы добавить к отличному ответу Стива.
Возможно, это не широко известно, но grep почти всегда работает быстрее при поиске более длинной строки шаблона, чем короткой, потому что в более длинном шаблоне Бойер-Мур может пропустить вперед более длинными шагами, чтобы достичь еще лучших сублинейных скоростей:
Пример:
Более длинная форма на 35% быстрее!
Как придешь? Бойер-Мур составляет таблицу перехода вперед из строки шаблона, и всякий раз, когда есть несоответствие, он выбирает самый длинный возможный пропуск (от последнего символа к первому), прежде чем сравнивать один символ во входных данных с символом в таблице пропуска.
Вот видео, объясняющее Бойера Мура (Кредит kommradHomer)
Другое распространенное заблуждение (для GNU grep) заключается в том, что
fgrep
он быстрее, чемgrep
.f
infgrep
не означает «быстро», это означает «фиксированный» (см. справочную страницу), и поскольку обе являются одной и той же программой и обе используют Бойера-Мура , между ними нет разницы в скорости при поиске фиксированных - строки без специальных символов регулярного выражения. Единственная причина , почему я использоватьfgrep
, когда есть регулярное выражение специальный символ (например.
,[]
или*
) Я не хочу, чтобы это было истолковано как таковой. И даже тогда более портативная / стандартная формаgrep -F
предпочтительнееfgrep
.источник
xs.txt
содержит 100000000 'x, и вы это сделаетеgrep yx xs.txt
, тогда он фактически не сможет найти совпадение раньше, чем если бы вы это сделалиgrep yxxxxxxxxxxxxxxxxxxx xs.txt
. В этом случае усовершенствование Boyer-Moore-Horspool до Boyer-Moore улучшает пропуск вперед, но, вероятно, в общем случае это будут не только три машинные инструкции.grep/fgrep/egrep
все жестко ссылалась на один и тот же исполняемый файл, прошли. Они (и другие расширения, такие какz*grep
bz*grep
утилиты, которые распаковываются "на лету") теперь представляют собой небольшие оболочкиgrep
. Некоторые интересные исторические комментарии о переключении между одним исполняемым файлом и оболочкой-оболочкой можно найти в этом коммите