kyuseo의 게임 프로그래밍
CFile, HFILE, FILE 대용량 파일 로드(읽기) 속도 비교 실험 본문
개요.. |
CFile 보다 FILE 가 약 10배 빠르다던 글이 있어서 CFile, HFILE, FILE 대용량 파일 로드(읽기) 속도를 비교, 실험 해 보았습니다.
실험방식 |
- 약 20M 바이트의 파일 3개의 실험 재료로 준비한다.
- FILE, CFile, HFILE 을 3회 이상 테스트한다.
코드 |
for( int i=0; i<3; i++ ) { // // FILE 을 이용한 읽기 쓰기 시험 // { FILE* fp = fopen( "1.dat", "rb" );
fseek( fp, 0, SEEK_END ); int size = ftell( fp ); fseek( fp, 0, SEEK_SET );
BYTE* pBuffer = new BYTE[ size ];
DWORD start = GetTickCount(); fread( pBuffer, size, 1, fp );
CString str; str.Format( "FILE %d ms", GetTickCount() - start ); AfxMessageBox( str );
fclose( fp ); delete[] pBuffer; }
// // CFile 을 이용한 읽기 쓰기 시험 // { CFile file; file.Open( "2.dat", CFile::modeRead );
int size = file.GetLength(); BYTE* pBuffer = new BYTE[ size ];
DWORD start = GetTickCount();
file.Read( pBuffer, size );
CString str; str.Format( "CFile %d ms", GetTickCount() - start ); AfxMessageBox( str );
file.Close(); delete[] pBuffer; }
// // HFILE 을 이용한 읽기 쓰기 시험 // { HFILE hFile = _lopen( "3.dat",OF_READ );
int size = _llseek( hFile, 0, FILE_END ); _llseek( hFile, 0, FILE_BEGIN );
BYTE* pBuffer = new BYTE[ size ];
DWORD start = GetTickCount(); _lread( hFile, pBuffer, size );
CString str; str.Format( "HFILE %d ms", GetTickCount() - start ); AfxMessageBox( str );
_lclose( hFile ); delete[] pBuffer; } }
return 0; } |
결론 |
- 3가지 방식 모두 동일한 속도를 나타냅니다.
- 따라서 CFile 의 읽기(Read) 속도가 느리다는 글은 거짓으로 사료됩니다.
- 최초 로딩은 디스크에서 읽기 때문에 긴 시간이 소요됩니다.
- 이후 로딩은 윈도우 캐시 시스템에 의하여 메모리에 적재된 파일을 읽으므로 짧은 시간이 소요됩니다.
주의사항 |
- 본 실험은 약점을 지닌 실험방식임을 인정합니다.
- 하지만 결과는 일반적이고 올바르다고 판단하고 있습니다.
- 의심 있는 분들은 직접 추가 테스트 해보시기 바랍니다.