LuaJIT 테스트 해봤습니다.

게임 개발 소식 - 메인 페이지에 나오는 내용입니다.

Moderator: 류광

Post Reply
elluard
Posts: 3
Joined: 2006-02-19 13:00
Location: 수원대학교

LuaJIT 테스트 해봤습니다.

Post by elluard »

과연 LuaJIT 가 2~10배 정도 속도가 나온다 나온다 말만 듣다가
이제서야 테스트를 해봅니다.
결과부터 말씀드리자면 상당히 놀라운 결과였습니다.

일단 테스트용 Lua 코드는 다음과 같습니다.

function TrafficTest()
for i = 0 , 10000, 1 do
iii = i * i*i*i*i*i*i*i*i*i*i*i
--중략, iii = i * i*i*i*i*i*i*i*i*i*i*i 와 같은 코드가 200라인 정도 있습니다.
end
end

테스트한 C++ 코드는 다음과 같습니다.

루아 팅커를 사용하여 lua 함수를 호출하였습니다.

int _tmain(int argc, _TCHAR* argv[])
{
lua_State *L = lua_open();
luaL_openlibs(L);
int Start, End;
printf("LuaJIT Performance Test\n");


printf("case one, LuaJIT is activated\n");
//LuaJIT on, 디폴트 상태로 켜져있지만 명시적으로 한번 더 넣어주고 한다.
luaJIT_setmode(L, 0, LUAJIT_MODE_ENGINE|LUAJIT_MODE_ON);
lua_tinker::dofile(L, "TestFunction.lua");

Start = GetTickCount();

//루프의 수를 10, 100, 1000 순서대로 늘려가면서 복잡도를 증가시켰습니다.
for (int i = 0; i < 10; i++)
{
lua_tinker::call<void>(L, "TrafficTest");
}
End = GetTickCount();
printf("Process Time : %d\n", End - Start);


//Case Two JIT off

printf("case two, LuaJIT is deactivated\n");
luaJIT_setmode(L, 0, LUAJIT_MODE_ENGINE|LUAJIT_MODE_OFF);
lua_tinker::dofile(L, "TestFunction.lua");

Start = GetTickCount();
//루프의 수를 10, 100, 1000 순서대로 늘려가면서 복잡도를 증가시켰습니다.
for (int i = 0; i < 10; i++)
{
lua_tinker::call<void>(L, "TrafficTest");
}
End = GetTickCount();
printf("Process Time : %d\n", End - Start);
return 0;
}

결과는 경이적이다 못해 충격적(일천한 제 경험 탓 일수도 있습니다만, 이게 과연 스크립트언어인가 할 정도로)입니다.

10(c 루프 횟수) x 10000(lua 루프 횟수)
JIT 사용시 : 0 ms
JIT 미사용시 : 2406 ms

100(c 루프 횟수) x 10000(lua 루프 횟수)
JIT 사용시 : 16 ms
JIT 미사용시 : 23937 ms

1000(c 루프 횟수) x 10000(lua 루프 횟수)
JIT 사용시 : 187 ms
JIT 미사용시 : 240016 ms

스크린샷을 올릴 방법을 몰라 텍스트로 일일이 쳐서 올립니다.

스크린샷을 포함한 글은 http://captainthomas.tistory.com/ 에서

보실 수 있습니다.
류광
Posts: 3805
Joined: 2001-07-25 09:00
Location: GPGstudy
Contact:

Post by 류광 »

좋은 내용 고맙습니다~

블로그 자체에 링크를 거셨는데 시간이 지나면 뒤로 밀릴테니 글 자체에 링크 겁니다:

캡틴☆토마스 :: LuaJIT 의 성능 테스트

그리고 지금 이 게시판 성격과는 살짝 어긋난 느낌이 있는데요... 다음 번에는 블로그에 쓰신 글을 글을 소개하는 형태로 소식을 써주시면 작성하시기에도 편하고 게시판 성격과 좀 더 잘 맞을 것 같습니다.
oranke
Posts: 244
Joined: 2002-05-09 09:00

Post by oranke »

오래간만에 GPG에 올리는 글이네요.
elluard 님의 글을 읽고 저도 한 번 테스트 해 봤습니다.

http://oranke.tistory.com/93

결론은?? 적재에는 시간이 좀 더 걸리고 실행에는 많이 빨라지더군요. ^^;;
mastercho
Posts: 587
Joined: 2004-05-09 20:37

Post by mastercho »

oranke wrote:오래간만에 GPG에 올리는 글이네요.
elluard 님의 글을 읽고 저도 한 번 테스트 해 봤습니다.

http://oranke.tistory.com/93

결론은?? 적재에는 시간이 좀 더 걸리고 실행에는 많이 빨라지더군요. ^^;;
링크를 따라 읽어봤는데
luaL_loadbuffer() 이걸로 테스트는 하는건 더 느려질수 밖에 없지 않나여?
그 함수로 특정 함수를 호출하는건 매번 파싱및 최적화 컴파일을 실행을 해야 하기때문이 아닐지


이미 컴파일된 상태의 함수호출로만 따져야 하지 않나 싶습니다
[보통 처음 시작할때 혹은 로딩? 아니면 특정 이벤트시에 , 루아소스를 컴파일해 읽는 작업을 하지 않나 싶습니다 ]

한마디로 적재로 거론 하신 내용은 무의미 하지 않을까요?
oranke
Posts: 244
Joined: 2002-05-09 09:00

Post by oranke »

mastercho 님 말씀대로 입니다.
저 시간이 의미를 가지는 건, 제가 만든 구조가 거지같아서에요. ㅠㅠ;;

초기에 루아를 적용하면서 기존 시스템의 스크립트 호출을 단순히 대체하는 방법을 사용했습니다. 몬스터가 죽으면 *** 루아파일을 실행시키면서 그 안의 ScriptMain()에 적절한 인자를 던져주는 방법으로 말이죠.

지금은 트리거가 루아 파일을 직접 실행하지 않고 이미 적재된 루아함수를 돌리는 방식으로 많이 변경되었지만, 예전에 만들었던 퀘스트들이 모두 이런 방식으로 바뀔 때 까지는 함께 혼용해야 하는 상황입니다. ^^;;
Post Reply