open VS fopen VS CreateFile 성능 차

hol_ding의 이미지

Windows 환경을 기준으로 질문드려봅니다.

게임 엔진을 제작하던 도중 '파일 입출력' 파트를 프로그래밍하는데 생긴 궁금증이네요.

크로스 플랫폼을 목표로 하는 게임 엔진 인지라 뭘 선택해야할지 더 고민이 됩니다.

open (엄밀히 말하자면.. VS2012에서 open은 deprecated 되어서 _open이 맞겠지만 말이지요) 함수는 커널 함수인걸로 알고있습니다.

CreateFile은 Windows에서 제공하는 API인걸로 알고있는데 어느 서적에선지 이 함수가 저수준 파일 입출력 함수라고 본적이 있는것 같습니다.

fopen은 이식성을 위해서 두 함수중 하나를 이용하는 wrapper 함수이자 표준인걸로 알고있습니다.

.. 방금 책을 확인해본 바로는 CreateFile에서 보안 수준 및 여타 다른것들을 보장해준다고 하네요.

추정하는것이긴 하지만 보안 수준 및 다른 부분을 같이 처리한다면 CreateFile은 느린게 맞나요?

저수준 함수라는데 혹해서 사용할지 말아야 할지 모르겠습니다.

무엇보다 속도가 가장 중요한 상황에서 뭐가 가장 좋은 선택일까요?

※ 만일 CreateFile 함수를 선택한다 해도 다른 OS에 맞게 분기해서 코딩할 생각입니다.

klara의 이미지

성능차는 잘 모르겠지만 fopen 하나의 오버해드가 걱정될 정도로 수많은 파일을 열어야 한다면 디비(파일디비)쓰는게 맞지 않나 싶습니다.

hol_ding의 이미지

질문 내용에서 언급했듯이 게임 엔진을 개발하는 중이었습니다.
API 하나하나의 속도가 생명인 상황인데..

많은 파일을 여는게 중요하기보다는, 하나를 열더라도 빨리 여는게 중요한 시점이네요..

"Success"

jick의 이미지

게임 엔진같이 속도가 중요한 걸 만든다면 더더욱 파일 오픈 따위의 시간을 염려하고 있으면 안됩니다. 코드는 일반적으로 성능이 좋을수록 짜는데 오래 걸리고 유지보수도 어렵습니다. 모든 API를 다 최대한 빠르게 만들겠다면 코드가 감당할 수 없을만큼 복잡해져서 죽도밥도 안됩니다. 코드가 너무 복잡해지면 나중에 정말로 성능이 중요한 부분을 발견해도 코드가 엉켜서 더이상 최적화를 할 수 없는 상태가 됩니다.

그냥 최대한 단순하게 짜놓고 나중에 게임 엔진 다 만들어진 다음에 파일 오픈 성능이 문제가 되면 그때 바꾸세요.

mirheekl의 이미지

다른 것들도 어차피 CreateFile을 호출할겁니다. 따라서 CreateFile을 직접 호출하는게 좋겠지만, 멀티플랫폼이라면 저역시 그쪽은 맨 나중에 신경쓰겠습니다. 재컴파일후 바로 쓸 수 있는 함수 위주로 사용하고 최적화는 나중에..

--

익명 사용자의 이미지

손으로 직접 분기문 최적화 해보겠다고 별의 별 이상한 코드(결과적으로 더 느려지는)를 다 짜던 모 씨가 생각나네요.
멀티플랫폼이면 더더욱 저수준 최적화는 신경 쓰지 말고 다른 부분에만 신경 쓰세요.
최적화가 아니라 공통적으로 쓸 수 있는 함수로 먼저 만들어야 합니다.

어차피 파일 I/O 클래스는 따로 만드실 테고, 그러면 호출부의 코드는 플랫폼이 바뀌어도 변경할 필요가 없습니다.
멀티 플랫폼 타겟 프로젝트면 보통 플랫폼 의존적인 코드는 따로 빼놓을 수 있는 구조로 만들기 때문에
더더욱 나중에 쉽게 변경 가능합니다.(그렇게 설계를 하셨다는 가정하에)
그것보다는 정말로 속도에 영향을 줄 수 있는 다른 부분에 신경을 더 쓰시길 권합니다.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.