В попытке оптимизировать мой bash-скрипт я загрузил свой файл в массив и попытался оттуда выполнить grep, и я заметил, что этот grep из памяти намного, намного медленнее, чем стандартный grep из файла, даже принимая во внимание Дело в том, что дисковый ввод-вывод выводится из уравнения.
1) ОК, поэтому у меня большой файл (около 3000 строк) с парами имя = значение, это мой «кэш». Я загружаю его в массив из файла (достаточно просто)
# load to array
l_i_array_index=1
while read line
do
g_a_cache[$l_i_array_index]=$line
let "l_i_array_index += 1"
done < $g_f_cache
2) Затем я запускаю небольшой тест производительности поиска:
time for i in `seq 1 100`
do
for l_i_array_index in `seq 1 ${#g_a_cache[@]}`
do
echo ${g_a_cache[$l_i_array_index]}
done | grep -c $l_s_search_string > /dev/null
done
real 0m14.387s
user 0m13.846s
sys 0m1.781s
3) То же самое, но прямо из файла на диске:
time for i in `seq 1 100`
do
grep -c $l_s_search_string $g_f_cache > /dev/null
done
real 0m0.347s
user 0m0.161s
sys 0m0.136s
Таким образом, производительность в 13-40 раз хуже, когда она должна быть лучше.
Мой вопрос: 1) в чем причина этого странного поведения 2) это разрешимо в bash или я должен укусить пулю и, наконец, переделать ее в Python
P.S. Тест проводится на Mac (bash v4), в Cygwin, время на ОДИН поиск составляет более секунды с обычным grep (что быстрее) и более 10 секунд с использованием метода массива. Сценарий близок к непригодному для использования ..