我想在我的应用程序中使用lua脚本做一些数学预计算,我不想硬编码它。我使用LUA作为DLL链接的libary。调用程序代码语言不是基于C的语言.
应用程序正在处理相当大的数组。该数组为正规化(25k-65k) *8双数列。
我的目标是:
目前,我测试了28000 x 6数组,但时间是5秒。
我使用lua_gettable函数并遍历数组,这是大量的堆栈写入和读取。
我的问题是没有其他解决办法吗?我检查了API,但可能跳过了一些函数。有没有可能要求lua将数组子集放入堆栈中?当然,情况恰恰相反。
非常感谢您的帮助和建议!
发布于 2019-11-23 20:35:44
正如DarkWiiPlayer所建议的那样,我认为以合理快的速度实现这一目标的最佳方法是使用Lua的用户数据。我用一个具有655368维的双矩阵的类做了一个例子,正如您所说的:
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核心英特尔核心i9 16 GB内存,作为比较.
https://stackoverflow.com/questions/59004593
复制相似问题