1

У меня есть каталог, содержащий более 80 ГБ баз данных простых текстовых файлов, которые, как я ожидаю, придется часто просматривать. По этой причине я пытаюсь создать несколько тестов для сравнения GNU grep с тем, что, насколько я могу судить, является самой быстрой альтернативой ему в настоящее время в дикой природе - ripgrep - чтобы определить, какой из них будет работать быстрее всего мои данные.

Первый тест будет состоять из трех циклов for , запускающих grep , rg и grep -F для текстового файла объемом 15 ГБ, а второй тест будет представлять собой серию одинаковых команд, выполняемых для всех данных. После нескольких дней постоянных циклов между использованием моих собственных ограниченных знаний bash , поиском решений и устранением ошибок, мне удалось собрать воедино следующее для первого теста (который также будет переназначен для второго теста):

for i in {1..15}; \
do (time LC_ALL=C grep -i "ajndoandajskaskaksnaodnasnakdnaosnaond" "15gbfile.txt") 2>&1 | 
tee -a "../grep Test 1.txt"; \
done; \
for i in {1..15}; \
do (time rg -i "ajndoandajskaskaksnaodnasnakdnaosnaond" "15gbfile.txt") 2>&1 |
tee -a "../ripgrep Test 1.txt"; \
done;
for i in {1..15}; \
do (time LC_ALL=C grep -Fi "ajndoandajskaskaksnaodnasnakdnaosnaond" "15gbfile.txt") 2>&1 |
tee -a "../grep -F Test 1.txt"; \
done;

Это некрасиво, но работает точно так, как задумано. Он выполняет все три цикла for один за другим, каждый из которых выполняет поиск 15 раз для длинной строки, которая никогда не будет найдена, а затем печатает вывод time для каждого grep как в STDOUT и в файл.

Однако, поскольку я бенчмаркинг, я хочу убедиться, что код подходит для точного тестирования (относительной) скорости моих вариантов использования в системе POSIX/bash/Cygwin, и что я ничего не пропускаю, что могло бы исказить результаты я получаю. В частности, такие вещи, как кэширование, дисковый ввод-вывод и другие соображения, о которых я не знаю. Я также приветствовал бы любые предложения, которые заставили бы его вести себя более надежно \ выглядеть менее уродливым.

1 ответ1

1

ИМХО, вы тестируете предвзято, потому что вы запускаете три команды в разное время. У вас должен быть один цикл, который последовательно выполняет команды grep, rgrep, grep -F, и если вы можете сделать этот порядок случайным, это будет даже лучше.

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .