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设置一个函数引用,这个在热更时需要额外处理一下。

⚠️ **GitHub.com Fallback** ⚠️