Я был очень удивлен, увидев, что когда вы добавляете опцию --ignore-case
в grep
, это может замедлить поиск в 50 раз. Я тестировал это на двух разных машинах с тем же результатом. Мне любопытно узнать объяснение огромной разницы в производительности.
Я также хотел бы увидеть альтернативную команду grep для поиска без учета регистра. Мне не нужны регулярные выражения, просто фиксированный поиск строк. Сначала тестовый файл будет текстовым файлом размером 50 Мб с некоторыми фиктивными данными, вы можете использовать следующий код для его создания:
Создать test.txt
yes all work and no play makes Jack a dull boy | head -c 50M > test.txt
echo "Jack is no fun" >> test.txt
echo "Jack is no Fun" >> test.txt
Демонстрация
Ниже приведена демонстрация медленности. Добавляя параметр --ignore-case
, команда становится в 57 раз медленнее.
$ time grep fun test.txt
all work and no plJack is no fun
real 0m0.061s
$ time grep --ignore-case fun test.txt
all work and no plJack is no fun
Jack is no Fun
real 0m3.498s
Возможные пояснения
Google google вокруг меня нашел дискуссию о том, что grep медленнее в локали UTF-8. Поэтому я провел следующий тест, и он ускорился. Языковой стандарт по умолчанию на моей машине en_US.UTF-8
, поэтому установка его на POSIX
, похоже, сделала загрузку производительности, но теперь, конечно, я не могу правильно искать текст Unicode, что нежелательно. Это также еще в 2,5 раза медленнее.
$ time LANG=POSIX grep --ignore-case fun test.txt
all work and no plJack is no fun
Jack is no Fun
real 0m0.142s
Альтернативы
Мы могли бы использовать Perl вместо этого быстрее, но все же в 5,5 раза быстрее, чем чувствительный к регистру grep. И POSIX grep выше примерно в два раза быстрее.
$ time perl -ne '/fun/i && print' test.txt
all work and no plJack is no fun
Jack is no Fun
real 0m0.388s
Поэтому мне бы хотелось найти верную альтернативу и объяснение, если у кого-нибудь есть.
ОБНОВЛЕНИЕ - CentOS
Две машины, которые были испытаны выше обоих, выполняли Ubuntu один 11.04 (Natty Narwhal), другой 12.04 (Precise Pangolin). Выполнение тех же тестов на машине CentOS 5.3 дает следующие интересные результаты. Результаты работы двух случаев почти идентичны. Теперь CentOS 5.3 был выпущен в январе 2009 года, а работает grep 2.5.1, в то время как Ubuntu 12.04 работает с grep 2.10. Таким образом, в новой версии могут быть изменения и различия в двух дистрибутивах.
$ time grep fun test.txt
Jack is no fun
real 0m0.026s
$ time grep --ignore-case fun test.txt
Jack is no fun
Jack is no Fun
real 0m0.027s