Lua / FiveM,为什么获取哈希对象很慢?

我通过使用 ESX v1.2 构建 FiveM 角色扮演服务器来介绍 Lua。 代码中存在许多低效性,并且我已经孤立了大部分问题,这些问题会在服务器中导致“服务器线程阻塞”,但有一件事让我有些困惑。

有一个“扩展玩家”对象,它包含了从各种数据库调用中汇总的许多 RP 特定信息,通常称为 xPlayer。 每个玩家都有一个服务器 ID,它是一个数字,并且有一个名为 ESX.Players 的 Lua 表,xPlayer 存储为使用哈希的格式 ESX.Players [source] = xPlayer

有一个功能:

ESX.GetPlayerFromId = function(source)
    return ESX.Players [tonumber(source)]
end

这个函数包装了使用哈希值进行获取的过程,这是我们在其中经常遇到服务器线程阻塞的地方。在调用代码中,我已经删除了所有处理逻辑,只留下了这个函数调用,并且问题仍然存在,而且注释掉它,问题便消失了。问题是为什么,既然它只是从哈希表中获取,那么由于哈希表中的东西已经是实例化的表,并且在该过程中不会达到任何 IO 或执行任何繁琐的操作,为什么会造成延迟呢?它只是一个存储的实例。

唯一引起我的关注的是,在 xPlayer 表中有一些值,然后是许多功能。 Lua 表中这些函数的重量足以减慢返回对其的引用吗?此文件显示扩展玩家表在哪里创建并返回 https://github.com/esx-framework/es_extended/blob/v1-final/server/classes/player.lua

我正在将所有这些函数推送到专用实用程序表上,该表将存在一次,每个函数都会获取 xPlayer 参数以由该函数进行处理。 100 多个 FiveM 资源中有数千个调用返回到 xPlayer。() 调用,因此代码扭矩和回归测试的重量非常大,因此目前代码库尚未处于发布到生产服务器以测试 40 多个玩家的状态。任何人都可以确认我是否在正确的轨道上,如果将 xPlayer 表的函数移除,是否有可能在通过哈希键检索时提供性能提升?如果有,为什么呢?

点赞