c언어 Low level 코딩을 통한 파일 입출력 성능 극대화

kjyong98의 이미지

c에서 read/write와 fread/frwite가 상황에 따라서 속도차이가 있는것으로 알고있습니다.
저는 전자가 시스템 콜 함수이기때문에 커널에 직접 접근을해서 무조건 빠를줄 알았는데 그게 아닌것같더군요.
가장 큰 이유는 버퍼사용 유무에 있는것같구요.
하지만 단순히 파일 입출력 속도만을 놓고 봤을 때 stat 구조체의 st_blksize 변수를 이용해서 대상 파일의 블록 사이즈를 읽어와서 해당 블록 크기단위로 read/write한다면 성능을 가장 극대화할 수 있다는 정보를 알게되었는데 이게 맞는말인건가요?

Yi Soo An@Google의 이미지

The IO block size is "a hint as to the 'best' unit size for I/O operations" - it's usually the unit of allocation on the physical disk.

https://stackoverflow.com/a/1346859/8512710

---------------
Happy Hacking!

jick의 이미지

일단 현재 프로그램 수행시간 중 I/O에 쓰이는 시간이 몇 %가 되는지 먼저 확인해 보시는 게 좋을 것 같습니다.

대부분의 경우 입출력에 쓰이는 시간 얼마 안됩니다. fwrite를 쓰든 write를 쓰든 무슨 다른 수단을 쓰든 대세에 큰 차이 없습니다.

그리고 실제로 프로그램 수행시간에 의미있는 차이를 줄 만큼 입출력을 많이 한다면, 십중팔구 "왜 이 프로그램은 입출력을 이렇게 많이 할까?"를 고민해서 I/O 사용량 자체를 줄이는 게 더 유용한 접근 방법입니다.

bushi의 이미지

외부 함수 호출은 적게하면 적게 할 수록 좋습니다. 특히 시스템 콜은 더욱 더 그렇습니다.
1MiB 짜리 컨텐트를 파일에 기록해야 한다면, 1MiB 짜리 버퍼로 write() 한번 호출하는게 가장 좋습니다.

이것도 주기적(?)으로 올라오는 소위 "low level" 이니 "최적화" 니를 거론하는 대표적인 질문같은데,
어떤 길로 어떻게 빠지면 이런 생각들을 하는지 궁금하네요.

doraq의 이미지

윗분들이 말하는바를 다른 예를 통해 설명하자면...
차로 물건을 가지고 어딜 가야됩니다.
님께선 최대한의 스피드를 위해 차를 튜닝하고 계십니다.
그것도 나쁘진 않지만, 업무자체를 효율화해서 아예 가야하는 곳의 위치를 더 가까운곳으로 바꾸거나,
한번에 물건을 두개를 나르거나..
물건에 따라 차가 아닌 오토바이로 하거나, 등등의 더 넓게보는 접근이 필요합니다.

다들 이런식의 답을 하는 이유는 님이 알아낸 내용이 맞기는 하지만
별 효과가 없을것이기 때문입니다. 정확히 그 블럭크기가 아니더라도
버퍼만 크게쓰면 다 그게그거 거든요.

댓글 달기

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