Lua垃圾回收及内存优化

本文探讨了Lua的垃圾回收机制及其在内存优化中的应用。通过减少内存使用,如改变数据结构以节省内存,以及重用和回收对象,如避免在循环内创建新对象,可以有效管理Lua资源。此外,文章提到了缓存化技术以减少新对象的创建,并讨论了如何通过调整垃圾回收器参数来优化性能。同时,文中提供了检测和避免Lua内存泄漏的方法,强调了定期显式调用垃圾回收器的重要性。
摘要由CSDN通过智能技术生成

当处理Lua资源时,我们也应该遵循提倡用于地球资源的3R原则——Reduce, Reuse and Recycle,即削减、重用和回收。

削减是最简单的方式。有很多方法可以避免使用新的对象,例如,如果你的程序使用了太多的表,可以考虑改变数据的表述形式。一个最简单的例子,假设你的程序需要操作折线,最自然的表述形式是:

复制代码
polyline =
{
    { x = 10.3, y = 98.5 },
    { x = 10.3, y = 18.3 },
    { x = 15.0, y = 98.5 },
    --...
}
复制代码

尽管很自然,这种表述形式对于大规模的折线来说却不够经济,因为它的每个点都需要用一个表来描述。第一种替代方式是使用数组来记录,可以省点内存:

复制代码
polyline =
{
     { 10.3, 98.5 },
     { 10.3, 18.3 },
     { 15.0, 98.5 },
     --...
}
复制代码

对于一个有一百万个点的折线来说,这个修改可以把内存占用从95KB降低到65KB。当然,你需要在可读性上付出代价:p[i].x比p[i][1]更易懂。

另一个更经济的做法是使用一个数组存储所有x坐标,另一个存储所有y坐标:

polyline =
{
    x = { 10.3, 10.3, 15.0, ...},
    y = { 98.5, 18.3, 98.5, ...}
}

原有的

p[i].x    

现在变成了

p.x[i]    

使用这种表述形式,一百万个点的折线的内存占用降低到了24KB。

循环是寻找降低垃圾回收次数的机会的好地方。例如,如果在循环里创建一个不会改变的表,你可以把它挪到循环外面,甚至移到函数外作为上值。试对比:

复制代码
function foo (...)
     for i = 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值