2008년 03월 25일
각종 DataReader 성능 비교
게임내에서 사용되는 각종 데이터들, 주로 기획에서 만들어서 서버/클라이언트에서 읽을수 있는 데이터로 변환해서 게임내에서 다양하게쓰이게 됩니다. 예를 들면 아이템 데이터, NPC데이터, 스킬데이터 등이 있겠습니다. 이런 데이터들은 보통 서버가 시작될때메모리로 읽어들여서 로직내에서 필요한 데이터가 있을때 저장된 특정한 컨테이너(벡터, 맵, 해쉬테이블 등)에서 값을 가져오게됩니다. 저는 DataReader라고 부르고 있습니다. 이 DataReader를 메모리상에 상주 시키지 않고 DB를 이용해볼까 하는 생각이 들어서 성능 비교를 해보게 되었습니다. (특성상 Insert/Update/Delete 속도는 별 의미가없으므로 Select속도만 측정)
사용된 컨테이너(혹은 DB)
- Array(strcmp) : 일반 배열 입니다. for문을 통해 차례대로 키값을 비교하여 값을 찾습니다.
- Array(index) : 일반 배열을 index로 직접 접근합니다.
- Map(string) : 키값이 string인 std::map입니다. map.find()로 값을 찾습니다.
- Map(HashFunction) : 해쉬함수를 이용하여 키값이 unsigned long인 map입니다.
- HashMap(string/HashFunction) : 키값이 string/unsigned long 인 stdext::hash_map입니다.
- SQLite(file/memory) : 오픈소스 파일DB입니다.
- MySQL, MSSQL : ...
사용된 해쉬함수
데이터
- 구조 : char code[12] 외에는 별 의미 없는 데이터입니다.
struct TestData
{
char code[12]; // 키값
int level;
short diatance;
char name[32];
};
- 건수 : 2만건
쿼리문 : SELECT code, level, distance, name FROM tbl_Perf WHERE code = ‘code19000’
성능 비교표
Debug

Release

결과
역시 Hash함수를 이용한 컨테이너들이 키값이 정수값이기 때문인지 빠른 성능을 보여줍니다. Debug에서는 hashmap이Release에서는 map이 미세하게 앞서고 있습니다. SQLite도 DB중에서는 file, memory 버젼 모두 좋은 성능을보여주고 있습니다.
Map/HashMap이 역시 빠르기는 하지만 메모리에 상주시키는 것보다 외부로 빼면 메모리도절약하고 서버의 복잡도도 줄일수도 있고 중간에 데이터를 교체할 수도 있는 등의 유연한 구조를 만들수 있을것 같아서 실제프로젝트에서는 Map과 SQLite를 병행해서 사용해볼까 합니다. Factory 패턴이나 Facade 패턴을 사용하면 간단하게교체가 가능하겠지요. SQLite는 구조가 단순하고 사용이 간편한 파일 DB입니다.(실행파일도 하나 데이터 파일도 하나.) 메인DB로 사용하는 것보다는 위와 같은 용도나 게임서버 다운시 데이터 보전 용도로 사용하면 좋을 것 같습니다.
사용된 컨테이너(혹은 DB)
- Array(strcmp) : 일반 배열 입니다. for문을 통해 차례대로 키값을 비교하여 값을 찾습니다.
- Array(index) : 일반 배열을 index로 직접 접근합니다.
- Map(string) : 키값이 string인 std::map입니다. map.find()로 값을 찾습니다.
- Map(HashFunction) : 해쉬함수를 이용하여 키값이 unsigned long인 map입니다.
- HashMap(string/HashFunction) : 키값이 string/unsigned long 인 stdext::hash_map입니다.
- SQLite(file/memory) : 오픈소스 파일DB입니다.
- MySQL, MSSQL : ...
사용된 해쉬함수
unsigned long GetHashCode( const char* pString )http://www.gpgstudy.com/forum/viewtopic.php?t=795 에서 가져왔습니다. 링크는 해쉬함수에 대한 활발한 논의가 있었던 스레드 입니다.
{
unsigned long i,len;
unsigned long ch;
unsigned long result;
len = strlen( pString );
result = 5381;
for( i=0; i<len; i++ )
{
ch = (unsigned long)pString[i];
result = ((result<< 5) + result) + ch; // hash * 33 + ch
}
return result;
}
데이터
- 구조 : char code[12] 외에는 별 의미 없는 데이터입니다.
struct TestData
{
char code[12]; // 키값
int level;
short diatance;
char name[32];
};
- 건수 : 2만건
쿼리문 : SELECT code, level, distance, name FROM tbl_Perf WHERE code = ‘code19000’
성능 비교표
Debug

Release

결과
역시 Hash함수를 이용한 컨테이너들이 키값이 정수값이기 때문인지 빠른 성능을 보여줍니다. Debug에서는 hashmap이Release에서는 map이 미세하게 앞서고 있습니다. SQLite도 DB중에서는 file, memory 버젼 모두 좋은 성능을보여주고 있습니다.
Map/HashMap이 역시 빠르기는 하지만 메모리에 상주시키는 것보다 외부로 빼면 메모리도절약하고 서버의 복잡도도 줄일수도 있고 중간에 데이터를 교체할 수도 있는 등의 유연한 구조를 만들수 있을것 같아서 실제프로젝트에서는 Map과 SQLite를 병행해서 사용해볼까 합니다. Factory 패턴이나 Facade 패턴을 사용하면 간단하게교체가 가능하겠지요. SQLite는 구조가 단순하고 사용이 간편한 파일 DB입니다.(실행파일도 하나 데이터 파일도 하나.) 메인DB로 사용하는 것보다는 위와 같은 용도나 게임서버 다운시 데이터 보전 용도로 사용하면 좋을 것 같습니다.
# by | 2008/03/25 05:47 | Programming | 트랙백




☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]