Скорость манипуляции строки Bash vs. Трубопровод

Каждая архитектура определяет «ABI» (двоичный интерфейс приложения), который в основном говорит: «Первый аргумент идет сюда, второй идет сюда, третий идет сюда ... return ценность возвращается сюда ". Вы читаете спецификацию ABI, а затем используете порядок и размер аргументов функции, чтобы определить, в какой регистр они входят.

См. https://stackoverflow.com/questions/2535989/what -are-the-call-conventions-for-unix-linux-system-calls-on-x86-64

Вам нужно будет сгенерировать разные сборки для каждой платформы, на которую вы хотите ориентироваться. Но вы можете быть достаточно уверены, что все платформы Linux x86_64 совместимы с двоичными кодами, и так далее для x86, ARM, PowerPC и т. Д. Но есть еще BSD: -)

Вот несколько шпаргалок для x86 и x86_64 (осуществил быстрый поиск в Google)

Но также имейте в виду, что сами номера системных вызовов различаются между платформами , поэтому 'open' на x86_64 равно 3, а на x86 - 5.

{{1 }}

1
13.07.2018, 01:00
2 ответа

Я проверил, установив одну из переменных. Выполнение этого скрипта дважды:

while read line; do
        md5sum=${line%%" "*}
        #md5sum=$(echo $line | awk '{print $1}')
        echo "SUM: $md5sum FILE:_$file"
done < manifest.Stuph.180620

сначала с

md5sum=${line%%" "*}

и далее с

md5sum=$(echo $line | awk '{print $1}')

где файл "manifest.Stuph.180620" имеет длину 100939 строк (== около 14 МБ )дал следующие результаты:

Первый запуск (с использованием встроенной в bash обработки строк)

real    0m4.750s
user    0m4.174s
sys     0m0.550s

Второй запуск (с использованием конвейера)

real    10m54.255s
user    4m42.257s
sys     7m32.880s

Некоторые (такие как я )скажут, что если скорость имеет значение, то вам все равно не следует возиться с оболочкой, но иногда вы можете захотеть быть более эффективным -независимо от того, в какой среде вы работаете. Используете для работы.

Обратите внимание, что при этом:

while read md5sum filename; do
    (...etc...)

даже более эффективен, чем выполнение присваивания переменной, но не до такой степени, чтобы исключить конструкцию подстановки команд/конвейера/awk. Что мне кажется наиболее интересным, так это разница между производительностью сборки bash -и использованием внешних команд. Я буду более усердно изучать и использовать причудливые встроенные вещи!

0
28.01.2020, 00:32

Да, использование внутренней команды bash позволяет избежать многих системных вызовов. Особенно, когда есть рекурсия.

Другой пример :мы должны использовать *против $ (ls ).

Bash предлагает несколько способов выполнения простых манипуляций со строками (вырезания и замены ). Но не более. Потому что он не для этого создан. В примере :сложно проверить наличие шаблона в строке без внешней команды.

Внешние программы более оптимизированы под свои задачи (cat, sed, grep, awk, cut, sort,...)

0
28.01.2020, 00:32

Теги

Похожие вопросы