getenv의 성능은?

dongyuri의 이미지

프로그램을 구동시킬 때 환경변수를 보통 getenv 함수로 읽어오는 경우가 많습니다.
개인적인 프로그래밍 습관일지 모르지만, 보통 프로그램 시작시에만 쓰는 경우가 많습니다.

이렇게 getenv로 호출하는 것과, config성 파일에서 정보를 읽어서 전역변수에 정보를 저장한 후 참조하는 것이
얼마나 차이가 날까 하는 생각이 문득 들었습니다.

쉘에서 시작되는 동시에 갖고 있는 정보를 참조하는 getenv와 전역변수에서 정보를 참조하는 경우
성능 차이가 얼마나 될까요?
막연히 별 성능 차이는 없을것 같다는 생각도 들긴 하지만 질문을 올려봅니다.

단지 getenv로 참조하는 값은 변경시킬 수가 없어서 잘 쓰지 않는 것일까 하는 생각도 드네요.

ganadist의 이미지


파일에서 설정을 읽어 오는것은 io에 많이 의존적일 수 있지만, getenv는 어느환경에서나 거의 동일한 성능을 유지할 수 있을 것 같습니다.

그리고 setenv로 값을 변경할 수 있습니다.

----
데스크탑 프로그래머를 꿈꾸는 임베디드 삽질러

dongyuri의 이미지

제가 설명을 잘못 한것 같아서 부연 설명을 하겠습니다.

알고 싶은 것은, 파일 IO가 일어나는 작업인 파일에서 읽어오는 것 vs getenv()의 비교가 아니라,
글로벌(?) 변수에서 읽어오는 것 vs getenv()의 비교입니다.

예를 들면,
sprintf(temp, "%s", source);
sprintf(temp, "%s", getenv("SOURCE"));
의 작업이 있을 때 두가지의 성능차이가 있는지 하는 것입니다.
물론 source는 스트링을 담고 있는 변수이고,
환경변수에도 "SOURCE"가 set되어 있겠지요.

그리고, 찾아보니,
프로그램안에서 값을 변경하는 것은 putenv,
쉘에서 값을 변경하는 것은 setenv군요.

ganadist의 이미지

glibc의 getenv의 구현을 살펴보면 char **environ에서 순차적으로 검사해서 리턴하도록 되어 있습니다.

단순 성능이라면 글로벌 변수에서 읽는게 빠르긴 할테지만, 크게 속도에 영향을 끼치지는 않을 것 같습니다.

----
데스크탑 프로그래머를 꿈꾸는 임베디드 삽질러

cinsk의 이미지

속도 면에서, 변수에서 읽는 것이 약간이나마 빠를 것 같습니다. 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/

bushi의 이미지

라이브러리의 경우 환경변수가 선호됩니다.
대표적인 예를 들자면 libc 의 LANG 정도가 되겠고,
정말로 감사하게 생각한, 피부로 느낀 경험담을 적으라면 SDL 의 각종 환경변수입니다.
라이브러리를 사용하는 각 어플리케이션들이 라이브러리 config 용 설비를 가지고 있지 않아도 됩니다.

라이브러리에서 사용하는 환경변수,
라이브러리와 어플리케이션, 쉘이 공유하는 전역변수 처럼 사용할 수도 있습니다.
많은 제약이 따르긴 합니다만, 말 그대로 "환경변수" 입니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.