首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >缓慢地提高Lua get_table的性能

缓慢地提高Lua get_table的性能
EN

Stack Overflow用户
提问于 2019-11-23 04:43:18
回答 1查看 228关注 0票数 1

我想在我的应用程序中使用lua脚本做一些数学预计算,我不想硬编码它。我使用LUA作为DLL链接的libary。调用程序代码语言不是基于C的语言.

应用程序正在处理相当大的数组。该数组为正规化(25k-65k) *8双数列。

我的目标是:

  • 将这个数组放入lua脚本中,使用全局变量
  • 读取这个数组,从lua脚本
  • 中读取这个数组,我想要达到的操作小于100 is。

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

我使用lua_gettable函数并遍历数组,这是大量的堆栈写入和读取。

我的问题是没有其他解决办法吗?我检查了API,但可能跳过了一些函数。有没有可能要求lua将数组子集放入堆栈中?当然,情况恰恰相反。

非常感谢您的帮助和建议!

EN

回答 1

Stack Overflow用户

发布于 2019-11-23 20:35:44

正如DarkWiiPlayer所建议的那样,我认为以合理快的速度实现这一目标的最佳方法是使用Lua的用户数据。我用一个具有655368维的双矩阵的类做了一个例子,正如您所说的:

代码语言:javascript
复制
class MatrixHolder {
public:
    double matrix[65536][65536][8];
};

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

代码语言:javascript
复制
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脚本:

代码语言:javascript
复制
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微秒

代码语言:javascript
复制
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核心英特尔核心i9 16 GB内存,作为比较.

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59004593

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档