getenv의 성능은?
글쓴이: dongyuri / 작성시간: 수, 2006/12/06 - 8:08오전
프로그램을 구동시킬 때 환경변수를 보통 getenv 함수로 읽어오는 경우가 많습니다.
개인적인 프로그래밍 습관일지 모르지만, 보통 프로그램 시작시에만 쓰는 경우가 많습니다.
이렇게 getenv로 호출하는 것과, config성 파일에서 정보를 읽어서 전역변수에 정보를 저장한 후 참조하는 것이
얼마나 차이가 날까 하는 생각이 문득 들었습니다.
쉘에서 시작되는 동시에 갖고 있는 정보를 참조하는 getenv와 전역변수에서 정보를 참조하는 경우
성능 차이가 얼마나 될까요?
막연히 별 성능 차이는 없을것 같다는 생각도 들긴 하지만 질문을 올려봅니다.
단지 getenv로 참조하는 값은 변경시킬 수가 없어서 잘 쓰지 않는 것일까 하는 생각도 드네요.
Forums:
파일에서 설정을
파일에서 설정을 읽어 오는것은 io에 많이 의존적일 수 있지만, getenv는 어느환경에서나 거의 동일한 성능을 유지할 수 있을 것 같습니다.
그리고 setenv로 값을 변경할 수 있습니다.
----
데스크탑 프로그래머를 꿈꾸는 임베디드 삽질러
제가 설명을 잘못
제가 설명을 잘못 한것 같아서 부연 설명을 하겠습니다.
알고 싶은 것은, 파일 IO가 일어나는 작업인 파일에서 읽어오는 것 vs getenv()의 비교가 아니라,
글로벌(?) 변수에서 읽어오는 것 vs getenv()의 비교입니다.
예를 들면,
sprintf(temp, "%s", source);
sprintf(temp, "%s", getenv("SOURCE"));
의 작업이 있을 때 두가지의 성능차이가 있는지 하는 것입니다.
물론 source는 스트링을 담고 있는 변수이고,
환경변수에도 "SOURCE"가 set되어 있겠지요.
그리고, 찾아보니,
프로그램안에서 값을 변경하는 것은 putenv,
쉘에서 값을 변경하는 것은 setenv군요.
glibc의 getenv의 구현을
glibc의 getenv의 구현을 살펴보면 char **environ에서 순차적으로 검사해서 리턴하도록 되어 있습니다.
단순 성능이라면 글로벌 변수에서 읽는게 빠르긴 할테지만, 크게 속도에 영향을 끼치지는 않을 것 같습니다.
----
데스크탑 프로그래머를 꿈꾸는 임베디드 삽질러
속도 면에서,
속도 면에서, 변수에서 읽는 것이 약간이나마 빠를 것 같습니다. getenv()를 쓸 경우, 함수 호출 overhead도 있을 것이며, 해당 env 변수의 name을 lookup하는 부분도 있을 것입니다. getenv()가 구현된 방식에 대한 표준은 없습니다.
setenv()는 C 표준에 없는 함수이며, SUS 표준(POSIX)입니다.
또, setenv()로 저장할 수 있는 문자열의 길이는 제한되어 있습니다. (환경변수의 전체 크기가 ARG_MAX를 넘을 수 없습니다.) 그리고 환경 변수 값으로 쓰일 수 있는 문자열은 도중에 '\0'을 포함할 수 없습니다.
따라서 단순히 어떤 값을 저장할 목적으로, 환경 변수를 쓸 이유는 전혀 없습니다. 환경 변수는 프로그램에 어떤 정보를 전달하기 위해 쓰는 것입니다. 다른 목적으로 쓰기에는 적당하지 않습니다.
--
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://www.cinsk.org/cfaqs/
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://cinsk.github.io/cfaqs/
라이브러리의 경우
라이브러리의 경우 환경변수가 선호됩니다.
대표적인 예를 들자면 libc 의 LANG 정도가 되겠고,
정말로 감사하게 생각한, 피부로 느낀 경험담을 적으라면 SDL 의 각종 환경변수입니다.
라이브러리를 사용하는 각 어플리케이션들이 라이브러리 config 용 설비를 가지고 있지 않아도 됩니다.
라이브러리에서 사용하는 환경변수,
라이브러리와 어플리케이션, 쉘이 공유하는 전역변수 처럼 사용할 수도 있습니다.
많은 제약이 따르긴 합니다만, 말 그대로 "환경변수" 입니다.
댓글 달기