int Plus(int a, int b)
{
return a + b;
}

_declspec(naked) int PlusAsm(int a, int b)
{
__asm
{
mov ebx, dword ptr ss:[esp+8]
mov edx, dword ptr ss:[esp+4]
add edx, ebx
mov eax, edx
retn
}
}

int _tmain(int argc, _TCHAR* argv[])
{
for(int nCnt = 0; nCnt < 2; ++nCnt)
{
{
g_Timer.StartFrequency(1);
int nResult = 0;
for(int i = 0; i < 1000000000; ++i)
{
nResult += Plus(1,2);
}
g_Timer.EndFrequency(1);

__int64 n64Time = g_Timer.GetTime(1);
printf( "Normal nResult:%d, Time:%I64d\n\n", nResult, n64Time );
}

{
{
g_Timer.StartFrequency(1);
int nResult = 0;
for(int i = 0; i < 1000000000; ++i)
{
nResult += PlusAsm(1,2);
}
g_Timer.EndFrequency(1);

__int64 n64Time = g_Timer.GetTime(1);
printf( "Assemble nResult:%d, Time:%I64d\n\n", nResult, n64Time );
}
}
}

return 0;
}

ShsTimer.h


#define g_Timer CShsTimer::GetInstance()

/*

#include "ShsTimer.h" //1. 헤더 선언


void main()

{

g_Timer.StartFrequency(1); //2. 시작점 정하기


Sleep(1000);


g_Timer.EndFrequency(1); //3. 종료점 정하기


__int64 n64Time = g_Timer.GetTime(1); //4. 시간 값 리턴 받기

TRACE( "%I64d\n", n64Time ); //5. 결과 값은 1000이 출력 됨

}


※ Sleep(1000); 대신 수행 시간을 알고싶은 코드를 넣으면 됩니다.


void main()

{

g_Timer.Start(3000, 1); // 3초 후 CheckFired에서 true를 리턴하도록 세팅합니다.


for(;;)

{

if( g_Timer.CheckFired(1) ) // 3초 후 true를 리턴합니다.

{

TRACE( "return" );

return;

}

}

}


void main()

{

for(;;)

{

if( g_Timer.SleepEx(1000, 1) ) // 1초 마다 "1"을 출력합니다. Sleep과 동일

{

TRACE( "1" );

}

}

}


※ 주의

 - 인덱스 인자를 줄 때 한 묶음 이외에는 사용해서는 안됩니다. SetTimer의 EventID와 동일한 개념입니다.


*/


struct tFrequencyInfo

{

tFrequencyInfo():m_n64SetTime(0)

{


}

LARGE_INTEGER m_start;

LARGE_INTEGER m_end;

__int64 m_n64SetTime;

};


class CShsTimer

{

private:

CShsTimer();

LARGE_INTEGER m_f;

bool m_bCanNotBeUsed; // true면 현재 컴퓨터에서는 사용 불가

map<int, tFrequencyInfo> m_mapFrequencyInfo;


public:

static CShsTimer& GetInstance();


void StartFrequency( int _nIndex ); // 시간을 측정 할 시작 점 지정

void EndFrequency( int _nIndex ); // 시간을 측정 할 종료 점 지정

__int64 GetTime( int _nIndex ); // Start과 End을 지정 후 걸린 시간을 ms단위로 리턴


void Start(__int64 _n64SetTime, int _nIndex ); // 얼마간의 시간을 흐른뒤에 CheckFired 에서 true를 리턴 할지 설정 해줌 ms단위(1000 == 1초)

bool CheckFired( int _nIndex ); // Start으로 세팅 한 시간이 흐를 때 까지 false를 리턴하다가, 세팅한 시간이 되면 true를 계속 리턴

bool SleepEx(__int64 _n64SetTime, int _nIndex); // Sleep()과 동일 한데 false를 리턴하고, 시간 흐르면 true 리턴

// _n64SetTime 세팅 한 시간이 흐르기 전에는 false 리턴, _n64SetTime만큼 시간이 흐르면 딱 한번 true 리턴하고, 처음과 똑같이 반복


};





ShsTimer.cpp


nclude "stdafx.h"

#include "ShsTimer.h"


CShsTimer& CShsTimer::GetInstance()

{

static CShsTimer Instance;

return Instance;

}


CShsTimer::CShsTimer()

{

// 고해상도 타이머의 주파수를 얻는다.

QueryPerformanceFrequency(&m_f);


if( 0 == m_f.QuadPart )

m_bCanNotBeUsed = true;

else

m_bCanNotBeUsed = false;

}


void CShsTimer::StartFrequency( int _nIndex )

{

if( m_bCanNotBeUsed )

return;


// 시작 시점의 CPU 클럭수를 얻는다.

QueryPerformanceCounter(&m_mapFrequencyInfo[_nIndex].m_start);

}


void CShsTimer::EndFrequency( int _nIndex )

{

if( m_bCanNotBeUsed )

return;


// 끝 시점의 클럭수를 얻는다.

QueryPerformanceCounter(&m_mapFrequencyInfo[_nIndex].m_end);

}


__int64 CShsTimer::GetTime( int _nIndex )

{

if( m_bCanNotBeUsed )

return 0;


// 끝 시점의 CPU 클럭수에서 시작 시점의 클럭수를 뺀 후 주파수를 1000으로 나눈 값을 나눈다.

// 1초 기준의 주파수를 1000 으로 나누었기 때문에 1밀리초 동안 발생하는 진동수로 나눈 셈이다.

__int64 ms_interval = (m_mapFrequencyInfo[_nIndex].m_end.QuadPart - m_mapFrequencyInfo[_nIndex].m_start.QuadPart)/(m_f.QuadPart/1000);


return ms_interval;

}


void CShsTimer::Start( __int64 _n64SetTime, int _nIndex )

{

if( m_bCanNotBeUsed )

return;


m_mapFrequencyInfo[_nIndex].m_n64SetTime = _n64SetTime;

StartFrequency(_nIndex);

}


bool CShsTimer::CheckFired( int _nIndex )

{

if( m_bCanNotBeUsed )

return false;


EndFrequency(_nIndex);


if ( GetTime(_nIndex) > m_mapFrequencyInfo[_nIndex].m_n64SetTime )

return true;


return false;

}


bool CShsTimer::SleepEx( __int64 _n64SetTime, int _nIndex )

{

if( m_bCanNotBeUsed )

return false;


if( 0 == m_mapFrequencyInfo[_nIndex].m_n64SetTime )

{

Start(_n64SetTime, _nIndex);

return false;

}


if( CheckFired(_nIndex) )

{

StartFrequency(_nIndex);

return true;

}


return false;

}



데브피아 SQL Server 에서 퍼왔어요.

http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=38&MAEULNo=16&no=37711&ref=37699

질문&답변
 랭킹 테이블을 만들려고 하는데 어떤 방법이 좋은지요?  | Modeling2003-04-29 오후 12:16:17
송현석 (myble)  송현석님께 메시지 보내기송현석님을 내 주소록에 추가합니다.송현석님의 개인게시판 가기번호: 37699  / 읽음:333

 

  점수에 따라 랭킹을 줄려고 하는데 어떻게 하는게 적절한 방법인지.. 어떻게 해야 할까 해서 질문드립니다.

-----------

회원테이블

----------

아이디

이름

점수

 rank

.......

----------

 

위와 같이 테이블이 되어있구여 rank아래로 ....은 그외 여러가지 컬럼이 있습니다.

랭킹 디스플레이에는 아이디 이름 점수 rank만 있음 되구여

회원테이블 자체에 rank를 일정 시점마다 값을 변경시켜주는것이 좋을지

아니면 랭킹테이블을 따로 빼내서 일정 시점마다 랭킹테이블을 만들어주는것이 좋은지요?

 

insert into rank select 아이디,이름,점수 from 회원테이블 order by 점수 desc

이렇게 쿼리를 줘서 새로운 랭킹 테이블을 해주는것이 좋은지.

 

update 회원테이블 set 회원테이블.rank = aa.rank

from 회원테이블, (select b.이름 이름,

                                   b.점수 점수,

                                  (select count(*)+1

                                    from 회원테이블 a

                                    where a.점수 > b.점수) rank

                          from 회원테이블 b ) aa

where 회원테이블.이름 = aa.이름

 

이런방법이 좋을까요? 업데이트쿼리는 게시판에서 찾은 쿼리문입니다.

만약 랭킹을 매겨야 하는것이 10만명 정도이고 하루에 한번씩 랭킹을 다시 매겨줘야 한다면

어떻게 해야 할까요?

위의 두가지 방법외에 다른 방법이 있으면 알려주세요.

첫번째에서

insert를 사용하는 이유는 MSSQL에서 테이블을 복사할수 있는 방법을 찾지 못해서...

create table rank

as

select 아이디,이름, 점수

from 회원테이블

order by 점수 desc;

요런 쿼리문이 먹히지가 않네요.. ㅡㅡ;

랭킹은 수시로 회원들에 의해 조회가 됩니다.

인덱스는 어떻게 해주는것이 성능이 좋아지는지요?  ^^

급하게 만들어야 하는것이라서 질문 올립니다.

도움 부탁드려요

 아참 쿼리문은 일정한 시간에 자동으로 돌릴려고 합니다.

이 글에 답변 등록하기
 [답변][☆]모...... 단순하게.. 복사를 한다면야... 2003-04-30 오전 10:28:13
황순영 (stonefly)  황순영님께 메시지 보내기황순영님을 내 주소록에 추가합니다.황순영님의 개인게시판 가기번호: 37711  

앗... 하루가 지난거 같은데.. 아직도.. 답이 엄네여..^^a (그사이 또 누가 쓸런지도..^^;;)

 

하여가네..

랭킹하는 방법은 여러가지가 있죠.. 카렌 아줌마 Inside SQL 2K 보시면..

랭킹 방법에 대해서.. 3~4가지가 나와 있습니다..

항상 느끼는거지만.. 오라클의 ROWNUM 비스무리한넘 있으면 좋으련만.. 하는 생각과..

8i R2 부터 있는 Analytic Function 있으면 ... 좋겠다는 생각이 매번 듭니다..

하지만 SQL Server에는 이런것이 없기 때문에 모..

있는거 잘 활용해서 써야겠죠..

 

우선.. 테이블 복제인데..

CREATE TABLE 에서 AS로 SELECT 해서 쓰는 문장은 오라클 문법인듯 하네여..^^a

님께서 원하시는 방법으로 SQL 서버에는

 

SELECT * INTO rank FROM Table1 WHERE 조건 ORDER BY 점수 DESC;

 

이렇게 하면 tank 라는 테이블이 만들어 지게 됩니다...

 

만일 위의 것을 이용해서 한다면, 더더군다나 주기적으로 갈아 엎어 져야 한다면..

rank 테이블을 따로 만드는것도 좋을듯하네요...

 

SELECT 아디디,  indentity(int, 1, 1) as rank INTO rank FROM Table1 WHERE 조건 ORDER BY 점수 DESC;

 

라고 하게 되면 점수 순서에 따라 아이디와 랭킹이 매겨 지게 됩니다..

필요할 경우 기존 사용자 정보와 조인해서 가져가면되고 사용자 테이블을 매번 수정안해도 되니까.. 부하를 줄일수 있지만서도, 대번 테이블을 Drop 하고 위의 문장을 실행시켜야하는 문제가 좀 있죠..

또하나의 문제는 동일 점수에 대한 동일 랭킹이 안된다는 문제가 남아 있고요..

님께서 중간에 쓰셨던..

Sunquery를 사용해서 랭킹을 사용하시는게.. 비록 테이블을 두번 읽어야 하는 문제가 있긴하지만...

같은 점수에 대해 동일한 랭킹을 부여할 수 있겠죠..

 

대충.. 이정도...

^^

 

__________________________________________

황순영 (Hwang, Soon-Young), MVP, MCP
Manager of (C)Dotnetsoft

Mobile : 016-745-0297
E-Mail : syhwang@dotnetsoft.co.kr
MSN : stonefly2001@hotmail.com
__________________________________________

이 글에 답변 등록하기
         [답변]SELECT * I...[한줄답변]2003-05-02 오후 3:46:00
송현석번호: 44531  
SELECT * INTO rank FROM Table1 WHERE 조건 ORDER BY 점수 DESC; 이와 같은경우여
이 글에 답변 등록하기
         [답변]복사+컬럼추가가 가...[한줄답변]2003-05-02 오후 3:48:00
송현석번호: 44532  
복사+컬럼추가가 가능한지여? rank라는 컬럼을 rank테이블에 추가해서 순위를 넣을려고 하거든여.
이 글에 답변 등록하기
 [답변]답변2003-04-30 오후 5:45:43
송덕용 (sdyno1)  송덕용님께 메시지 보내기송덕용님을 내 주소록에 추가합니다.송덕용님의 개인게시판 가기번호: 37734  

랭킹을 10만 건

그리고 검색하는 게 많다

 

그렇다면 검색되는 쿼리문이 단순해야겠죠.

방법은 여러가지가 있겠습니다만  (프로시져 , 뷰를 사용해서 한번에 랭킹을 뽑아서 보여주는 방법이 있지많은

권장하고 싶지는 않습니다. 그많큼 비용 소모가 많고 IO를 많이 잡아 먹을테니까요.)

 

저라면 이렇게 하겠습니다.

 

먼저

SELECT * INTO 문을 사용해서 랭킹을 뽑아 랭킹테이블에 쓰는 쿼리가 있는

프로시져를 만들고

매일 하루에 한번씩 JOB 을 돌립니다.

 

유저들이 사용하는 테이블은 최적화된 랭킹 테이블이므로 db에 부담을 주지 않고 사용할 수 있습니다.

이 글에 답변 등록하기
         [답변]답면 감사합니다....[한줄답변]2003-05-02 오후 3:49:00
송현석번호: 44533  
답면 감사합니다.
이 글에 답변 등록하기
         [답변]SELECT * I...[한줄답변]2003-05-02 오후 3:49:00
송현석번호: 44534  
SELECT * INTO rank FROM Table1 WHERE 조건 ORDER BY 점수 DESC; 이와 같은경우여
이 글에 답변 등록하기
         [답변]복사+컬럼추가가 가...[한줄답변]2003-05-02 오후 3:49:00
송현석번호: 44535  
복사+컬럼추가가 가능한지여? rank라는 컬럼을 rank테이블에 추가해서 순위를 넣을려고 하거든여.
이 글에 답변 등록하기
         [답변]만약 불가능할경우 ...[한줄답변]2003-05-02 오후 3:53:00
송현석번호: 44536  
만약 불가능할경우 insert문을 사용하여  select * into을 대체하여 처리한다면 어떨까여?


[자문자답] VC++에서 방법알아냈습니다.

 

http://www.unicode.org/charts/


 

위의 웹 페이지를 참조해 보시고 아래의 코드를 참조하시면 될듯...

 

 

                //숫자
                if (char_ASCII >= 48 && char_ASCII <= 57 )
                        return 1;
                //영어
                else if ((char_ASCII>=65 && char_ASCII<=90)
                                || (char_ASCII>=97 && char_ASCII<=122))
                        return 2;
                //특수기호
                else if ((char_ASCII>=33 && char_ASCII<=47)
                                || (char_ASCII>=58 && char_ASCII<=64)
                                || (char_ASCII>=91 && char_ASCII<=96)
                                || (char_ASCII>=123 && char_ASCII<=126))
                        return 4;
                //한글
                else if ((char_ASCII >= 12592) || (char_ASCII <= 12687))
                        return 3;
                else
                        return 0;


INT64 CreateRaidHistory() 원형에서


int nLineNumber = (int)CreateRaidHistory();


INT64 를 (int)로 자료형 변환을 하니까 컴파일러가 정신 못 차리고 디버깅을 못 한다.


-_-;;


소스 위치를 못 찾음...

DB에서 자료형 선언은


CREATE TABLE UserInformationTbl

(

GiftInventory VARCHAR(MAX) NULL,

)


이렇게 하고,




ODBC를

"SQL Server Native Client 10.0" 으로 만들어야 한다.


그리고 SQLBindParameter 에서 3번째 인자 값과 4번째 인자값을

SQL_C_CHAR  , SQL_LONGVARCHAR,

로 넣어줘야 한다.

retcode = SQLBindParameter(hStmt, 1, SQL_PARAM_INPUT,

SQL_C_CHAR  , SQL_LONGVARCHAR,

nSize, 0, (SQLPOINTER) Data, nSize, &ind);


이상 끝!






출처: http://blog.naver.com/ballkiss?Redirect=Log&logNo=30025300601


ODBC에서 DB와 서버랑 맵핑하는 자료형 정리


Table 1. C vs ODBC Naming Correspondence

C Type identifier

ODBC C Typedef

C Type

SQL_C_CHAR

SQLCHAR

unsigned char

SQL_C_STINYINT

SCHAR

char

SQL_C_UTINYINT [i]

UCHAR

unsigned char

SQL_C_SSHORT [h]

SQLSMALLINT

short int

SQL_C_USHORT [h] [i]

SQLUSMALLINT

unsigned short int

SQL_C_SLONG [h]

SQLINTEGER

int

SQL_C_ULONG [h] [i]

SQLUINTEGER

unsigned int

SQL_C_SBIGINT

SQLBIGINT

_int64 [g]

SQL_C_UBIGINT [i]

SQLUBIGINT

unsigned _int64 [g]

solidDB does not support unsigned data types such as this.

SQL_C_FLOAT

SQLREAL

float

SQL_C_DOUBLE

SQLDOUBLE

SQLFLOAT

double

SQL_C_NUMERIC

SQLNUMERIC

unsigned char [f]

SQL_C_DECIMAL

SQLDECIMAL

unsigned char [f]

SQL_C_BINARY

SQLCHAR *

unsigned char *

SQL_C_TYPE_DATE [c]

SQL_DATE_STRUCT

struct tagDATE_STRUCT{
    SQLSMALLINT year;
    SQLUSMALLINT month;
    SQLUSMALLINT day;
} DATE_STRUCT; [a]          

SQL_C_TYPE_TIME [c]

SQL_TIME_STRUCT

struct tagTIME_STRUCT {
    SQLUSMALLINT hour;
    SQLUSMALLINT minute;[d]
    SQLUSMALLINT second;[e]
}          

SQL_C_TYPE_TIMESTAMP [c]

SQL_TIMESTAMP_STRUCT

struct tagTIMESTAMP_STRUCT {
    SQLSMALLINT year; [a]
    SQLUSMALLINT month; [b]
    SQLUSMALLINT day; [c]
    SQLUSMALLINT hour;
    SQLUSMALLINT minute; [d]
    SQLUSMALLINT second;[e]
    SQLUINTEGER fraction; 
}          

원본링크

void 맵이동()

{

if( 맵을 생성해야 하나? )

{

맵 생성;

Npc 생성;

}


기존 맵에 있는 클라가 걸려있는 버프 저장;


기존 맵에 있는 클라에 유닛 제거;


방금 접속한 클라 생성;

방금 접속한 클라에게 이전맵에서 가지고 있었던 버프를 걸어줌;


방금 접속한 클라 정보를 맵안에 모든 클라에게 정보 전송;

방금 접속한 클라 버프정보를 맵안에 모든 클라에게 정보 전송;


Npc 정보 -> 방금 접속한 클라에게 전송;

Npc 버프 정보-> 방금 접속한 클라에게 전송;


기존 맵에 있었던 클라 정보 -> 방금 접속한 클라에게 정보 전송;

기존 맵에 있었던 클라 버프 정보 -> 방금 접속한 클라에게 버프 정보 전송;

}


1. 로비서버 -> 게임서버

 클라 정보 전달


2. 게임서버

 클라가 접속하길 기다린다. (10초간)


3. 게임서버

 접속이 완료 되면 각 클라 정보를 각 클라에게 보낸다.


4. 클라 -> 게임서버

 클라에서 준비가 완료되면 게임서버로 게임을 시작 할 모든 준비가 끝났음을 알린다.


5. 게임서버 -> 클라

 모든 클라에게 게임 시작을 알린다.


+ Recent posts