JAVA全系列 教程
3762个小节阅读:7089.4k
目录
C语言快速入门
JAVA全系列 教程
面向对象的程序设计语言
Python全系列 教程
Python3.x版本,未来主流的版本
人工智能 教程
顺势而为,AI创新未来
大厂算法 教程
算法,程序员自我提升必经之路
C++ 教程
一门通用计算机编程语言
微服务 教程
目前业界流行的框架组合
web前端全系列 教程
通向WEB技术世界的钥匙
大数据全系列 教程
站在云端操控万千数据
AIGC全能工具班
A A
White Night
table 也是性能的拦路虎
你先记住这一点,下面,我们就从 table 的创建、元素的插入、清空、循环使用等方面,分别来介绍相关的优化。
第一步,自然是创建数组。在 Lua 中,我们创建数组的方式很简单:
xxxxxxxxxx
local t = {}
上面这行代码,就创建了一个空数组;当然,你也可以在创建的时候,就加上初始化的数据:
xxxxxxxxxx
local color = {first = "red", "blue", third = "green", "yellow"}
不过,第二种写法对于性能的损失比较大,原因在于每次新增和删除数组元素的时候,都会涉及到数组的空间分配、resize
和 rehash
。
xxxxxxxxxx
LuaJIT 中的 table.new(narray, nhash) 函数
local new_tab = require "table.new"
local t = new_tab(100, 0)
for i = 1, 100 do
t[i] = i
end
有了 table 对象之后,下一步就是向它里面增加元素了。最直接的方法,就是调用
table.insert
这个函数来插入元素
xxxxxxxxxx
local new_tab = require "table.new"
local t = new_tab(100, 0)
for i = 1, 100 do
table.insert(t, i)
end
或者是先获取当前数组的长度,通过下标的方式来插入元素:
xxxxxxxxxx
local new_tab = require "table.new"
local t = new_tab(100, 0)
for i = 1, 100 do
t[#t + 1] = i
end
这一点又该如何解决呢?让我们看下 lua-resty-redis
这个官方的库是如何做的吧:
xxxxxxxxxx
local function _gen_req(args)
local nargs = #args
local req = new_tab(nargs * 5 + 1, 0)
req[1] = "*" .. nargs .. "\r\n"
local nbits = 2
for i = 1, nargs do
local arg = args[i]
req[nbits] = "$"
req[nbits + 1] = #arg
req[nbits + 2] = "\r\n"
req[nbits + 3] = arg
req[nbits + 4] = "\r\n"
nbits = nbits + 5
end
return req
en
既然 table 这么来之不易,我们自然要好好珍惜,尽量做到重复使用。不过,循环利用也是有条件的。我们先要把 table 中原有的数据清理干净,以免对下一个使用者造成污染。
这时,table.clear
函数就派上用场了。从它的名字你就能看出它的作用,它会把数组中的所有数据清空,但数组的大小不会变。也就是说,你用 table.new(narray, nhash)
生了一个长度为 100 的数组,clear 后,长度还是 100。
为了让你能够更清楚它的实现,下面我给出了一个代码示例,它兼容了标准 Lua:
xxxxxxxxxx
local ok, clear_tab = pcall(require, "table.clear")
if not ok then
clear_tab = function (tab)
for k, _ in pairs(tab) do
tab[k] = nil
end
end
end