이 질문이 너무 일반적이지 않기를 바랍니다. 저는 쉘 스크립팅을 처음 접했고 컴퓨터 아키텍처/비스크립팅 프로그래밍 배경을 가지고 있습니다. 제가 작업하는 스크립트는 전체 스크립트 주위에 하위 쉘을 생성하여 작성되는 경우가 거의 없습니다. 내가 작성 중인 스크립트에서 서브셸로 래핑할 수 있는 경우 그렇게 하면 나를 호출하는 다른 스크립트와 혼동되는 것을 방지할 수 있기 때문입니다. 이 접근 방식과 관련된 일부 오버헤드로 인해 이는 일반적인 관행이 아닌가요? 나는 이것을 온라인에서 찾는 데 어려움을 겪고 있습니다.
예:
#!/bin/bash
( #Start of subshell
echo "Some stuff here"
) #End of subshell
답변1
서브쉘에는 오버헤드가 있습니다.
내 시스템에서 최소 포크 실행 비용(파일이 콜드되지 않은 상태에서 디스크에서 프로그램을 실행할 때)은 대략 이고 2ms
, 최소 포크 비용은 대략 입니다 1ms
.
exec
서브셸의 경우 파일을 편집할 필요가 없으므로 비용 포크에 대해서만 이야기하고 있습니다 . 서브쉘이 합리적으로 낮게 유지되면 1ms
인간 지향 프로그램에서는 무시할 수 있습니다. 나는 인간이 이보다 더 빨리 일어나는 일을 알아차릴 수 있다고 믿지 않습니다 (현대 스크립팅 언어 해석기가 최신 상황을 50ms
시작하는 데 걸리는 시간입니다( python
여기서는 루비에 대해 이야기하고 있습니다 ) .)rvm
nodejs
100ms
그러나 루핑을 추가한 다음 전체 배치를 stdout으로 함수를 인쇄하여 상당히 일반적인 백틱 또는 $()
패턴을 대체할 수 있습니다. ).return
printf -v
이것배쉬 완료패키지는 전달된 변수 이름으로 반환하기 위해 아래에 설명된 기술을 사용하여 이 하위 쉘 비용을 특별히 방지합니다.http://fvue.nl/wiki/Bash:_Passing_variables_by_reference
비교하다
time for((i=0;i<10000;i++)); do echo "$(echo hello)"; done >/dev/null
그리고
time for((i=0;i<10000;i++)); do echo hello; done >/dev/null
fork
시스템 오버헤드가 얼마인지 에 대한 좋은 추정치를 제공해야 합니다 .
답변2
내 시스템에서 PSkocik이 제공한 뛰어난 코드를 실행해도 무시할 만한 결과가 나타났습니다.
그러나 이 예제는 정말 중요합니다. 기본 명령과 하위 쉘 명령입니다.
MyPath="path/name.ext"
# this takes forever
time for((i=0;i<10000;i++)); do echo "$(basename ${MyPath} )"; done >/dev/null
#this is over 100x less time
time for((i=0;i<10000;i++)); do echo "${MyPath##*/}"; done >/dev/null