Сравнительный анализ команд Bash со временем и ти
У меня есть каталог, содержащий более 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 ответ
ИМХО, вы тестируете предвзято, потому что вы запускаете три команды в разное время. У вас должен быть один цикл, который последовательно выполняет команды grep, rgrep, grep -F, и если вы можете сделать этот порядок случайным, это будет даже лучше.
С другой стороны, производительность - это еще не все, и мне потребовалось бы значительно более высокое быстродействие, чтобы переключиться на конкретную команду, и этот гораздо лучший исполнитель показал бы это даже при предвзятых тестах.