当前位置:  开发笔记 > 编程语言 > 正文

你如何预先在Lua中调整数组大小?

如何解决《你如何预先在Lua中调整数组大小?》经验,为你挑选了3个好方法。

我有一个Lua程序似乎比它应该的慢.我怀疑问题是我一次向一个关联数组添加值,并且表每次都必须分配新的内存.

似乎确实有一个table.setn函数,但它在Lua 5.1.3下失败了:

stdin:1: 'setn' is obsolete
stack traceback:
        [C]: in function 'setn'
        stdin:1: in main chunk
        [C]: ?

我从谷歌搜索中收集到的,我已经完成了这个功能在Lua 5.1中被折旧了,但我找不到什么(如果有的话)取代了这个功能.

你知道如何在Lua中预先确定一张桌子吗?

或者,当您向表中添加对象时,是否还有其他方法可以避免内存分配?



1> akauppi..:

让我更专注于你的问题:

一次一个地向关联数组添加值

Lua中的表是关联的,但是以数组形式(1..N)使用它们是优化的.他们在内部有双面.

所以..如果你确实是以关联方式添加值,请遵循上面的规则.

如果使用索引1..N,则可以通过设置t [100000] =某事来强制执行一次性大小调整.这应该工作,直到在Lua源中指定的优化数组大小的限制(2 ^ 26 = 67108864).在那之后,一切都是联想的.

ps旧的'setn'方法仅处理数组部分,因此它不适用于关联用法(忽略这些答案).

pps你有没有研究过保持Lua性能高的一般技巧?即知道表创建而不是重用表而不是创建新表,使用'local print = print'等来避免全局访问.


根据"Lua性能提示"(在http://www.lua.org/gems/),Lua分析表并将值放入哈希部分(如果数组部分),这个答案是不正确的(不再是?)小于array_N/2,所以构造`t = {}; t [100000] = true`将导致空数组部分和具有一个元素的散列部分.

2> 小智..:
static int new_sized_table( lua_State *L )
{
    int asize = lua_tointeger( L, 1 );
    int hsize = lua_tointeger( L, 2 );
    lua_createtable( L, asize, hsize );
    return( 1 );
}

...

lua_pushcfunction( L, new_sized_table );
lua_setglobal( L, "sized_table" );

然后,在Lua,

array = function(size) return sized_table(size,0) end

a = array(10)

作为一个快速破解,你可以添加C到lua.c.



3> Mike G...:

我不认为你可以 - 它不是一个数组,它是一个关联数组,如perl hash或awk数组.

http://www.lua.org/manual/5.1/manual.html#2.5.5

我不认为你可以从Lua方面有意义地预设它的大小.

但是,如果你在C端分配数组,那么

void lua_createtable (lua_State *L, int narr, int nrec);

可能是你需要的.

创建一个新的空表并将其推入堆栈.新表具有为较窄数组元素和nrec非数组元素预先分配的空间.当您确切知道该表将具有多少元素时,此预分配非常有用.否则你可以使用lua_newtable函数.

推荐阅读
贾志军
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有