c언어 Low level 코딩을 통한 파일 입출력 성능 극대화
글쓴이: kjyong98 / 작성시간: 일, 2018/04/08 - 11:12오전
c에서 read/write와 fread/frwite가 상황에 따라서 속도차이가 있는것으로 알고있습니다.
저는 전자가 시스템 콜 함수이기때문에 커널에 직접 접근을해서 무조건 빠를줄 알았는데 그게 아닌것같더군요.
가장 큰 이유는 버퍼사용 유무에 있는것같구요.
하지만 단순히 파일 입출력 속도만을 놓고 봤을 때 stat 구조체의 st_blksize 변수를 이용해서 대상 파일의 블록 사이즈를 읽어와서 해당 블록 크기단위로 read/write한다면 성능을 가장 극대화할 수 있다는 정보를 알게되었는데 이게 맞는말인건가요?
Forums:
The IO block size is "a hint
https://stackoverflow.com/a/1346859/8512710
---------------
Happy Hacking!
...
일단 현재 프로그램 수행시간 중 I/O에 쓰이는 시간이 몇 %가 되는지 먼저 확인해 보시는 게 좋을 것 같습니다.
대부분의 경우 입출력에 쓰이는 시간 얼마 안됩니다. fwrite를 쓰든 write를 쓰든 무슨 다른 수단을 쓰든 대세에 큰 차이 없습니다.
그리고 실제로 프로그램 수행시간에 의미있는 차이를 줄 만큼 입출력을 많이 한다면, 십중팔구 "왜 이 프로그램은 입출력을 이렇게 많이 할까?"를 고민해서 I/O 사용량 자체를 줄이는 게 더 유용한 접근 방법입니다.
외부 함수 호출은 적게하면 적게 할 수록 좋습니다.
외부 함수 호출은 적게하면 적게 할 수록 좋습니다. 특히 시스템 콜은 더욱 더 그렇습니다.
1MiB 짜리 컨텐트를 파일에 기록해야 한다면, 1MiB 짜리 버퍼로 write() 한번 호출하는게 가장 좋습니다.
이것도 주기적(?)으로 올라오는 소위 "low level" 이니 "최적화" 니를 거론하는 대표적인 질문같은데,
어떤 길로 어떻게 빠지면 이런 생각들을 하는지 궁금하네요.
맞습니다만.
윗분들이 말하는바를 다른 예를 통해 설명하자면...
차로 물건을 가지고 어딜 가야됩니다.
님께선 최대한의 스피드를 위해 차를 튜닝하고 계십니다.
그것도 나쁘진 않지만, 업무자체를 효율화해서 아예 가야하는 곳의 위치를 더 가까운곳으로 바꾸거나,
한번에 물건을 두개를 나르거나..
물건에 따라 차가 아닌 오토바이로 하거나, 등등의 더 넓게보는 접근이 필요합니다.
다들 이런식의 답을 하는 이유는 님이 알아낸 내용이 맞기는 하지만
별 효과가 없을것이기 때문입니다. 정확히 그 블럭크기가 아니더라도
버퍼만 크게쓰면 다 그게그거 거든요.
댓글 달기