注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Code@Pig Home

喜欢背着一袋Code傻笑的Pig .. 忧美.欢笑.记忆.忘却 .之. 角落

 
 
 

日志

 
 

[LuaGems] chap02: Lua Performance Tips  

2010-04-27 20:12:29|  分类: lang_lua |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
1. 先profile,找bottle neck,再动手

2. 使用 local
for i = 1, 1000000 do
  local x = math.sin(i)
end

local sin = math.sin      -- faster way
for i = 1, 1000000 do
  local x = sin(i)
end

3. 关于 table
lua 的 table 包含了 array, map 两种语义。我不认为这是个好的设计。
empty table 一开始包含了 0 size array 和 0 size map,所以:
for i = 1, 10000000 do
    local a = {}
    a[1] = 1; a[2] = 2; a[3] = 3
end

for i = 1, 10000000 do
    local a = {true, true, true}    -- 一开始初始化了 array size,比上面快
    a[1] = 1; a[2] = 2; a[3] = 3
end

并且,只有在插入新元素的时,才可能重新计算 size。所以:
a = {}
lim = 10000000
for i = 1, lim do a[i] = i end
for i = 1, lim do a[i] = nil end    -- 此时,a 内部的 size 还是很大的,并没有 shrink。

4. 关于 string
lua 对于同一份 string,只保存了一份 copy。所以变量对其都是 ref。所以在 s = a + b 的时候,其实是在创建新的 string,所以速度比较慢。大量字符串合并,推荐如下方式:
a = {}
a[1] = "abc"
a[2] = "bbb"
a[3] = "qqq"
table.concat(a, ",")

5. reuse
不要每次生成新的 table,尽量 reuse。
function foo (...)
    for i = 1, n do
        local t = { 1, 2, 3 }
        -- use t
    end
end

local t = { 1, 2, 3 }  -- faster, only create once
function foo (...)
    for i = 1, n do
        -- use t
    end
end
-----------------------------
local t = {}
for i = 1970, 2000 do
    t[i] = os.time({year = 1, month = 6, day = 14})
end

local t = {}
local aux = {year = nil, month = 6, day = 14)
for i = 1970, 2000 do
    aux.year = i
    t[i] = os.time(aux)
end
-----------------------------
文中还提到个更绝的,reuse coroutine。
co = corutine.create(function (f)
    while f do
        f = coroutine.yield(f())
    end
end)

co(function foo (...) do ... end)
co(function bar (...) do ... end)

6. LuaJIT
  评论这张
 
阅读(733)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017