fread/ifstream::read/mmap performance comparison

예전에 comp.lang.c++.moderated에서 iostream performance가 fread를 사용하는 것에 비해서 나쁘다라는 글을 읽고 해당 테스트 케이스를 사용하여 실제로 테스트해 보았다. 테스트 케이스는 일정 크기의 파일 내에서 특정 레코드를 찾아내는 코드로, 읽기 오퍼레이션에 대한 성능 테스트에 가깝다.

결론은 fread와 ifstream::read는 별 차이가 없고, mmap은 엄청나게 빠르다는 것이다. gcc 버전에 따라 약간의 우위를 보이는 것이 흥미롭다.

Platform

  • OS : Linux 2.6.8
  • CPU : Intel Pentimum III 1G * 2
  • RAM : 2G (ECC)
  • HDD : SCSI

Code

Results

gcc 3.3

fread
real    0m35.930s
user    0m31.622s
sys     0m4.109s
iostream
real    0m31.979s
user    0m27.519s
sys     0m4.289s
mmap
real    0m9.519s
user    0m8.526s
sys     0m0.967s

gcc 3.4

fread
real    0m37.535s
user    0m33.307s
sys     0m4.066s
iostream
real    0m38.024s
user    0m29.882s
sys     0m8.008s
mmap
real    0m13.320s
user    0m12.328s
sys     0m0.971s

gcc 2.95

fread
real    0m37.225s
user    0m32.928s
sys     0m4.157s
iostream
real    0m33.184s
user    0m28.788s
sys     0m4.227s
mmap
real    0m12.924s
user    0m11.896s
sys     0m1.003s

“fread/ifstream::read/mmap performance comparison”에 대한 2개의 생각

  1. iostream 성능 괜찮네요.. ‘사용법에 익숙치 않아서’ 사용자들이 가지는 반감이 제일 큰 거 같습니다. 이런 객관적인 자료로 이야기 해야 할 텐데 말이죠.

  2. mmap 이 빠른 이유는
    보통의 io
    file-system -> os buffer cache -> library buffer
    의 형태로 io 가 일어나는 대신
    file-system -> os buffer cache -> application memory ( not copy but mapping)
    이기 때문에 copy 가 당연히 한번 적게 일어납니다.
    비슷한 이유료 file 을 socket 을 통해 보낼때 buffered read 를 피하고 성능 향상을 위한 syscall 로 sendfile() 이 있습니다.

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

이 사이트는 스팸을 줄이는 아키스밋을 사용합니다. 댓글이 어떻게 처리되는지 알아보십시오.