서브쉘 사용에 따른 오버헤드는 무엇입니까?

서브쉘 사용에 따른 오버헤드는 무엇입니까?

이 질문이 너무 일반적이지 않기를 바랍니다. 저는 쉘 스크립팅을 처음 접했고 컴퓨터 아키텍처/비스크립팅 프로그래밍 배경을 가지고 있습니다. 제가 작업하는 스크립트는 전체 스크립트 주위에 하위 쉘을 생성하여 작성되는 경우가 거의 없습니다. 내가 작성 중인 스크립트에서 서브셸로 래핑할 수 있는 경우 그렇게 하면 나를 호출하는 다른 스크립트와 혼동되는 것을 방지할 수 있기 때문입니다. 이 접근 방식과 관련된 일부 오버헤드로 인해 이는 일반적인 관행이 아닌가요? 나는 이것을 온라인에서 찾는 데 어려움을 겪고 있습니다.

예:

#!/bin/bash
( #Start of subshell
echo "Some stuff here"
) #End of subshell

답변1

서브쉘에는 오버헤드가 있습니다.

내 시스템에서 최소 포크 실행 비용(파일이 콜드되지 않은 상태에서 디스크에서 프로그램을 실행할 때)은 대략 이고 2ms, 최소 포크 비용은 대략 입니다 1ms.

exec서브셸의 경우 파일을 편집할 필요가 없으므로 비용 포크에 대해서만 이야기하고 있습니다 . 서브쉘이 합리적으로 낮게 유지되면 1ms인간 지향 프로그램에서는 무시할 수 있습니다. 나는 인간이 이보다 더 빨리 일어나는 일을 알아차릴 수 있다고 믿지 않습니다 (현대 스크립팅 언어 해석기가 최신 상황을 50ms시작하는 데 걸리는 시간입니다( python여기서는 루비에 대해 이야기하고 있습니다 ) .)rvmnodejs100ms

그러나 루핑을 추가한 다음 전체 배치를 stdout으로 함수를 인쇄하여 상당히 일반적인 백틱 또는 $()패턴을 대체할 수 있습니다. ).returnprintf -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     

관련 정보