Lua大量字符串拼接方式效率对比及原因分析

零、字符串拼接除了下方所述的方法还有string.format(...),但是这个不适合拼接大量字符串,故不说明。
一、大量字符串拼接方式
1. 使用运算符..
2. 使用 table.concat (table [, sep [, start [, end]]]) 函数

二、实验
1. 代码
function operatorConcat(str,count)
    local result = ""
    for i=1,count do
        result = result .. str
    end
    return result
end

function tableConcat(str,count)
    local tbl = {}
    for i=1,count do
        table.insert( tbl,str)
    end
    return table.concat(tbl)
end


local str = "a"
local count = 100000

local start_time = os.clock()
operatorConcat(str,count)
print("operatorConcatTime:" .. os.clock() - start_time)

start_time = os.clock()
tableConcat(str,count)
print("tableConcatTime:" .. os.clock() - start_time)
2. 结果
    从图中看到,将100000个str="a"拼接成新的字符串,运算符..的时间是0.55919s,而table.concat()函数时间为0.023939s,差距20+倍。

三、原因分析
1. 使用运算符..
    每次拼接都需要申请新的空间,旧的 result 对应的空间会在某时刻被Lua的垃圾回收期GC,且随着result不断增长,越往后会开辟更多新的空间,并进行拷贝操作,产生更多需要被GC的空间,所以性能降低。
2. 使用 table.concat (table [, sep [, start [, end]]]) 函数
    table.concat 底层拼接字符串的方式也是使用运算符.. ,但是其使用算法减少了使用运算符..的次数,减少了GC,从而提高效率。主要思路:采用二分思想,用栈存储字符串,新入栈的字符串与下方的字符串比较长度,大于则使用运算符..拼接成新字符串,并移除栈顶的字符串,不断向下直至遇到长度更大的字符串或者栈底,这样保持最大的字符串位于栈底,栈呈现金字塔的形状,最终在使用运算符..将栈中的字符串拼接成最终的字符串。
四、参考链接
http://www.lua.org/pil/11.6.html
http://www.jb51.net/article/55124.htm
http://chinaren.wei.blog.163.com/blog/static/139076129201261842019332/

你可能感兴趣的:(Unity,Lua)