Global VS Ref Call - changnet/MServer GitHub Wiki
当C++需要回调到Lua脚本时,有两种选择:一是调用Lua的global函数,二是把Lua的函数存到注册表里。那这两种回调效率上有啥差别呢?
- ref调用
lua_pushcfunction( L,traceback );
lua_rawgeti(L, LUA_REGISTRYINDEX, ref);
LUA_OK != lua_pcall(L,0,0,-2)
- global调用
lua_pushcfunction( L,traceback );
lua_getglobal( L,"call_back" );
LUA_OK != lua_pcall(L,0,0,-2)
- 结果
simple benchmark test 10000000 times ref call elapsed time: 2.60 second;global call elapsed time: 2.01 second
simple benchmark test 10000000 times ref call elapsed time: 1.74 second;global call elapsed time: 1.82 second
simple benchmark test 10000000 times ref call elapsed time: 3.28 second;global call elapsed time: 2.74 second
simple benchmark test 10000000 times ref call elapsed time: 1.72 second;global call elapsed time: 1.83 second
simple benchmark test 10000000 times ref call elapsed time: 1.71 second;global call elapsed time: 1.82 second
simple benchmark test 10000000 times ref call elapsed time: 1.71 second;global call elapsed time: 1.83 second
simple benchmark test 10000000 times ref call elapsed time: 1.75 second;global call elapsed time: 1.85 second
simple benchmark test 10000000 times ref call elapsed time: 1.73 second;global call elapsed time: 1.86 second
simple benchmark test 10000000 times ref call elapsed time: 1.74 second;global call elapsed time: 1.87 second
simple benchmark test 10000000 times ref call elapsed time: 1.78 second;global call elapsed time: 1.85 second
simple benchmark test 10000000 times ref call elapsed time: 1.71 second;global call elapsed time: 1.84 second
simple benchmark test 10000000 times ref call elapsed time: 1.71 second;global call elapsed time: 1.85 second
simple benchmark test 10000000 times ref call elapsed time: 1.75 second;global call elapsed time: 1.87 second
simple benchmark test 10000000 times ref call elapsed time: 1.78 second;global call elapsed time: 1.88 second
simple benchmark test 10000000 times ref call elapsed time: 1.73 second;global call elapsed time: 1.86 second
可以看到,总体上ref调用是更高效,但差距并不算太大。考虑到整个引擎所有的游戏逻辑都在脚本,因此C++回调Lua的次数有限。而ref的方式是需要从Lua设置一个函数引用,这个在热更时需要额外处理一下。