增加Lua get_table的性能

我想在我的应用程序中使用lua脚本来做一些数学预计算,而不想硬编码。我使用LUA作为动态链接库。调用程序的编程语言不是基于C的语言。

应用程序处理的是相当大的数组。该数组通常是(25k-65k)*8个双精度数数组。

我的目标是:

  • 将此数组放入全局变量中的lua脚本中
  • 从lua脚本中读回此数组
  • 我希望在不到100ms的时间内完成此操作。

目前,我测试的数组是28000 x 6,但时间却是5秒。

我使用了lua_gettable函数,并在数组中进行迭代,这涉及大量的堆栈写入和读取。

我的问题是是否有其他解决方案?我检查了API,但可能跳过了某些功能。有没有可能要求lua将数组子集放入堆栈中?当然也有相反的方式。

非常感谢任何帮助和建议!

点赞
用户2725326
用户2725326

根据 DarkWiiPlayer 的建议,我认为在合理的快速度下实现此任务的最佳方法是使用 Lua 的用户数据。我创建了一个类,其中包含一个双重矩阵,具有 [65536][65536][8] 尺寸,就像你所说的那样:

class MatrixHolder {
public:
    double matrix[65536][65536][8];
};

然后,我创建了一个方法来创建一个新的 MatrixHolder,以及另一个方法来在矩阵的某个位置执行操作(将 I、J 和 K 作为参数传递)。

static int newMatrixHolder(lua_State *lua) {
    MatrixHolder* object;
    size_t nbytes = sizeof(MatrixHolder);
    object = static_cast<MatrixHolder*>(lua_newuserdata(lua, nbytes));
    return 1;
}

static int performOperation(lua_State *lua) {
    MatrixHolder* object = static_cast<MatrixHolder*>(lua_touserdata(lua, 1));
    int i = luaL_checkinteger(lua, -3);
    int j = luaL_checkinteger(lua, -2);
    int k = luaL_checkinteger(lua, -1);
    object->matrix[i][j][k] += 1.0;
    lua_pushinteger(lua, object->matrix[i][j][k]);
    return 1;
}

static const struct luaL_Reg matrixHolderLib [] = {
    {"new", newMatrixHolder},
    {"performOperation", performOperation},
    {NULL, NULL} // - signals the end of the registry
};

在我的电脑上,它以以下时间执行给定的 Lua 脚本:

m = matrixHolder.new()
i = matrixHolder.performOperation(m, 1,1,1);
j = matrixHolder.performOperation(m, 1,2,1);
i = matrixHolder.performOperation(m, 1,1,1);

大约 845 微秒

for i = 1, 1000
do
    m = matrixHolder.new()
    i = matrixHolder.performOperation(m, 1,1,1);
    j = matrixHolder.performOperation(m, 1,2,1);
    i = matrixHolder.performOperation(m, 1,1,1);
end

大约 617 毫秒

我不确定它是否符合你的目的,但它似乎比你提到的 5 秒要快得多。供参考,我的电脑是 2.3 GHz 的 8 核 Intel Core i9,内存为 16 GB。

2019-11-23 20:35:44