비트맵을 파일 입출력으로 직접 읽어서 분석하는게 아니라 메모리를 할당한 후 파일에서 메모리로 전체를 복사시킨 후 파일은 닫고 메모리의 내용만 읽는 코드였다.
흥미로운 방식이였다. 그러면서 든 생각이 그럼 바로 파일 입출력을 하는 것과 메모리에 올려서 하는 방식과 무엇이 다를까? 하는 것이였다. 그리고 이번 휴가를 통해서 바로 시험해 보았다.
실험 방법 : 어느정도 용량이 되는 TEXT 파일을 스트림에서 직접 읽는 방식과 메모리에 올려서 읽는 방식의 속도를 비교
소스 코드는 다음과 같다.
#include <stdio.h>
#include <stdio.h>
#include <windows.h>//GetTickTIme 호출
#define COUNT 1000000
//메모리를 통해서 파일을 읽는 것과 직접 FIle Stream에서 읽어 오는 것의 속도 비교
int main(void)
{
FILE* fp;//파일을 읽을 파일 포인터
char read[100];
char a;
char* str;
unsigned int FileSize;
int StreamTime;//스트림으로 읽었을 때의 시간
int MemoryTime;//메모리로 했을 때의 시간
//읽을 파일을 만드는 부분
unsigned long i;
if(fp = fopen("TestFile.txt","w"))
{
for(i = 0 ; i < COUNT ; i++)
{
fputs("TestFileText\n",fp);
}
fclose(fp);
}
//File Stream에서 읽기
if(fp = fopen("TestFIle.txt","r"))
{
StreamTime = GetTickCount(); //시간 재기
while(!feof(fp))
{
fgets(read,80,fp);
printf("%s",read);
};
StreamTime = GetTickCount() - StreamTime;
fclose(fp);
}
//Memory에 올린 후 읽기
if(fp = fopen("TestFIle.txt","r"))
{
MemoryTime = GetTickCount();//재기 시작
fseek(fp,0L,SEEK_END);
FileSize = ftell(fp);//파일의 크기를 알기 위해 끝까지 이동 후 크기 저장
str = malloc(sizeof(char) * FileSize);//크기 만큼 메모리 할당
memset(str,0,FileSize);
fseek(fp, 0L, SEEK_SET);//파일의 처음으로 이동
fread(str,sizeof(char)*FileSize,1,fp);//파일을 메모리에 복사
fclose(fp);//다 읽었으니 파일을 닫는다.
printf("%s",str);//읽은 내용을 출력
MemoryTime = GetTickCount() - MemoryTime;//측정 끝
printf("소요 시간 : %d Tick\n",MemoryTime);
free(str);//메모리 해제
}
printf("Stream : %d\nMemory : %d\n",StreamTime,MemoryTime);
return 0;
}
실험 결과
내용 출력 하는 시간 포함해서 결과는
스트림 직접 읽기 : 45542 Tick
메모리 올려서 읽기 : 10656 Tick
약 23%정도 메모리로 읽는 방식이 더 빨랐다.
프린트 시간을 뺴서 계산 하면 더 정확한 결과를 얻을 수 있었을 것이다.
이번 실험으로 역시 메모리에 올려 놓고 돌리는 것이 속도 면에서는 더 효과적이라는 걸 직접 볼 수 있었다. 이런 것을 이용하면 Progress를 계산한다던가, 리소스 같은 것을 올려 놓고 읽으면 Loading TIme을 줄일 수 있을 것이다.
이렇게 메모리에 올리는 방식을 사용하는 예로 더블 버퍼링을 예로 들 수 있을 것이다. 더블 버퍼링도 메모리에 뿌릴 내용을 미리 그려 놓고 화면에 한꺼번에 뿌리는 방식을 이용한다.
그런데 의문점이 있어. 저렇게 하면 효과는 있지만 실제로 메모리에 대용량으로 할당하는 식으로는 잘 안할 거라고 생각해.
malloc()이런 걸로 몇 MB나 하는 걸 할당하는것도 무식하다고 생각하고 요즘 프로그램들 용량 엄청나잖아. 그런걸 보조하기 위해서 페이징같은 것이 있는거고
그래도 위 방법은 어느 정도 규모의 리소스 파일들을 읽을 때는 유용한 방법이 될 거라고 생각하는데, malloc같은 할당 함수 위에 다른 방법은 없는건지, 그리고 HEAP 영역 말고 이런 상황같은 것을 위한 다른 할당 가능 공간은 없는 건지 궁금하다. 한번 알아 봐야 겠다.