예전에 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
iostream 성능 괜찮네요.. ‘사용법에 익숙치 않아서’ 사용자들이 가지는 반감이 제일 큰 거 같습니다. 이런 객관적인 자료로 이야기 해야 할 텐데 말이죠.
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() 이 있습니다.