最近自己做的一些小项目里面用到了Lua和C API混合编程。在处理事件上有两种设计,一种是在C层通过消息队列接收消息并根据消息类型调用对应的Lua函数,并向Lua层提供AddListener这样注册回调的方法。另一种是直接将消息队列方法暴露给Lua层,例如PushEvent,GetEvent等,然后在Lua层编写一些代码用来处理事件。最开始采用的是第一种方案,后来发现当消息量增多时会有一些卡顿,于是就想到是不是设计上带来了一些性能缺陷,通过下面的代码进行验证:
int test_function(lua_State* L)
{
int a = lua_tointeger(L, 1);
int b = lua_tointeger(L, 2);
int c = a + b;
lua_pushinteger(L, c);
return 1;
}
int test_in_c(int a, int b)
{
return a + b;
}
int benchmark()
{
LuaVM L;
lua_pushcfunction(L, test_function);
lua_setglobal(L, "ctestfn");
luaL_loadstring(L, "for i=1, 10000000 do ctestfn(1, 2) end");
clock_t before = clock();
lua_pcall(L, 0, 0, -1);
clock_t after = clock();
cout << "Loop in Lua, call into C: " << ((double)after - before)/CLOCKS_PER_SEC << "s" << endl;
luaL_loadstring(L, "for i=1, 10000000 do ctestfn(1, 2) end");
before = clock();
lua_call(L, 0, 0);
after = clock();
cout << "Loop in Lua, call into C (unprotected): " << ((double)after - before) / CLOCKS_PER_SEC << "s" << endl;
luaL_loadstring(L, "for i=1, 10000000 do pcall(ctestfn,