2013-03-14 8 views
10

Я пытаюсь понять различия между этими двумя подобными командами.Замена команд и замена процесса

aa=$(foo | bar | head -1) 
read aa < <(foo | bar | head -1) 
  • Я знаю, что <() требует #!/bin/bash, но это делает его медленнее?
  • Создают ли они такое же количество подоболочек?
  • Требуется ли такое же количество bash или sh процессов?

Я ищу, чтобы использовать команду с наилучшей производительностью.

ответ

6
  1. No. Bash быстрее в не-POSIX режиме.
  2. Всё зависит от меня. Это как специфическая для конкретной реализации, так и конкретная платформа.
    • В Bash оба требуют одинакового количества процессов.Если lastpipe не включен, для каждого элемента конвейера есть процесс, а подсела - для подстановки плюс родительский процесс.
    • В Bash, если включен lastpipe, последний элемент трубопровода будет exec без разветвления в обоих случаях, по-прежнему требующий одинакового количества процессов.
    • В ksh93 оба должны требовать одинаковое количество процессов в этом случае, но если последний элемент конвейера был встроенным, он будет выполняться в процессе родительского элемента для замены команды, делая его еще быстрее.
    • В обеих Bash и ksh93, если оболочка скомпилирована в системе, которая не поддерживает /dev/fd/*, оболочка вместо этого создаст именованные каналы для замещений процессов. Это может повлиять на производительность.
  3. Предыдущая пуля должна идти здесь, возможно. Примечание. «Подоболочка» необязательно подразумевает отдельный процесс, хотя почти во всех оболочках он делает (за исключением $(<...) во всем, кроме Bash, который его поддерживает). В mksh и ksh93 есть также подстановка команды стиля ${ ;}, но каждая оболочка реализует это по-другому. В ksh93 он может или не может дать ускорение. в мкш, возможно, нет. mksh не поддерживает подстановки процессов, а zsh не поддерживает (и не имеет возможности имитировать) BASHPID, поэтому я не изучил его.

Там нет ничего внутренне быстрее о замене команды, чем замещение процесса в Bash, но head является излишним в случае read, так как вы только читаете одну строку там. В стороне, всегда используйте head -n ... - -1 не переносится. Кроме того, не используйте read без -r, если вы не хотите, чтобы оболочка искажала вход.

2

Бенчмаркинг с Bash's встроенный time, первая форма медленнее второй.

Вы можете проверить это самостоятельно с:

bash -c 'time PIPELINE...' 

Оба создают подоболочки - с чтением оболочки и расширением выхода субоболочки в первом случае, и read встроено чтения командного интерпретатора от фона процесс во втором.

См:

+1

Хм, это не совсем правильно, как указано. Надеюсь, ты не против, я немного изменил это для тебя. В обоих случаях есть «файловые дескрипторы», и оба они всегда создают подоболочку, которая, по крайней мере, в Bash также всегда подразумевает по крайней мере одну вилку. В моих более обобщенных тестах разница между «read -rx <<(...)» и «x = $ (...)» почти неизмерима как с итерациями с небольшими входами, так и для одиночных больших входов , причем назначение было немного быстрее (как и ожидалось), но в исходном вопросе оба решения были нечетными и субоптимальными. – ormaaj

+0

Без проблем, спасибо за редактирование. –

1

Лучший способ повышения производительности здесь, чтобы избавиться от вилок и труб столько, сколько вы можете.

По всем вопросам и задачам вы не должны беспокоиться о проблемах с производительностью, как указано. 99% времени выполнения, вероятно, будут определяться конкретными командами, а не разницей в подстановке процессов и подстановкой команд. Вы знаете первый закон оптимизации? Не. Особенно, если вы жертвуете переносимостью. Используйте $(whatever) и забудьте все остальное. Если вы действительно беспокоитесь о производительности, это команды/трубы/вилки, которые вам нужно адресовать. В противном случае вы пытаетесь сбросить вес, сжимая слезы с ваших глаз.

1

Подстановка процессов в обход подоболочек, созданных с помощью piplines/command substitution. Синтаксис замены заменяется именем FIFO или FD, а команда внутри него запускается в фоновом режиме. Подстановка выполняется одновременно с в качестве расширения параметров и подстановки команд.

Ознакомьтесь с информацией о замене процесса, используемом в качестве «тройника».

http://mywiki.wooledge.org/ProcessSubstitution

 Смежные вопросы

  • Нет связанных вопросов^_^