Lua性能优化之table

本文深入探讨Lua中的Table实现原理,包括数组和哈希表部分,以及如何通过避免频繁的rehash操作来提升性能。文章提供了减少rehash次数的实用策略,如使用大table替代多个小table、初始化table时预设大小、正确清空table的方法等。

通常情况下,我们不需要知道Lua的table是如何实现的,但是为了对lua性能进行优化,去了解Lua table的实现细节是非常关键的。

01

table是如何实现的?

为了了解table的实现,我们可以查看Lua的C源码,如下:

 

图1-1 lua表的构成

Lua中的table是由两部分组成,数组部分和哈希表部分。数组部分储存着索引为整型的数据,哈希表存储着以其它类型为索引的键值对。哈希表使用一个哈希算法来计算键值对的key值,采用开链法来处理哈希冲突。当我们声明一个表t = { },此时t的数组部分和哈希表部分的大小都是0,当不断向数组插入键值对的时候 如下:

  • a[1] = 1 ,大小不够,需要扩容,扩容后数组部分的大小为1

  • a[2] = 2 ,大小不够,需要扩容,扩容后数组部分的大小为2

  • a[3] = 3 ,大小不够,需要扩容,扩容后数组大小为4.

执行扩容的过程叫做rehash,每次rehash时,会遍历整个table的数组部分和哈希表部分,统计其中有效的键值对,大小不够,则会扩容,扩容后的大小为2的整数幂次方,且保证rehash操作后整个数组部分的使用率大于50%。每次rehash都很耗时,使用table,我们应该尽量减少rehash。

  

02

如何减少Rehash?

    1.不要使用多个size较小的table,如果可以使用大的table来代替。

    由第一部分可以看到,当table的size从0扩展到4的时候需要

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值