• wusiration
    2019-08-11
    尝试了以下性能测试:
    (1)预先生成数组
    resty -e '
    local begin = ngx.now()
    local t = {}
    for i = 1,100000000 do
      table.insert(t, i)
    end
    ngx.update_time()
    print(ngx.now()-begin)
    '
    用时:21.62700009346
    resty -e '
    local new_tab = require "table.new"
    local begin = ngx.now()
    local t = new_tab(100000000, 0)
    for i = 1,100000000 do
      table.insert(t, i)
    end
    ngx.update_time()
    print(ngx.now()-begin)
    '
    用时:7.595999956131

    (2)自己计算table下标
    --使用insert函数
    resty -e '
    local new_tab = require "table.new"
    local begin = ngx.now()
    local t = new_tab(100000000, 0)
    for i = 1,100000000 do
      table.insert(t, i)
    end
    ngx.update_time()
    print(ngx.now()-begin)
    '
    用时:7.6459999084473
    --自己计算下标
    resty -e '
    local new_tab = require "table.new"
    local begin = ngx.now()
    local t = new_tab(100000000, 0)
    for i = 1,100000000 do
      t[i] = i
    end
    ngx.update_time()
    print(ngx.now()-begin)
    '
    用时:0.33599996566772

    (3)循环使用单个table
    --分别建立两个table
    resty -e '
    local new_tab = require "table.new"
    local begin = ngx.now()
    local t1 = new_tab(100000000, 0)
    for i = 1,100000000 do
      t1[i] = i
    end
    local t2 = new_tab(100000000, 0)
    for i = 1,100000000 do
      t2[i] = i
    end
    ngx.update_time()
    print(ngx.now()-begin)
    '
    用时:0.66700005531311

    --复用table
    resty -e '
    local new_tab = require "table.new"
    local begin = ngx.now()
    local t = new_tab(100000000, 0)
    for i = 1,100000000 do
      t[i] = i
    end
    for i = 1,100000000 do
      t[i] = i
    end
    ngx.update_time()
    print(ngx.now()-begin)
    '
    用时:0.40800023078918
    展开

    作者回复: 👍

    
     2
  • 回家
    2019-08-25
    OpenResty是从哪个版本开始完全绑定LuaJIT的呢?

    作者回复: 我记得是 1.15 这个版本开始就只支持自己的 LuaJIT 了。lua 和官方的 luajit 都不再支持了

    
     1
  • 回家
    2019-08-25
    table. clean函数的实现是循环遍历每一个元素,然后置空,相比重新创建一个table来说效率更高。这个是和table的大小无关的是吧,table的重利用的效率总是高于新建一个表格。
    这样也有一个要求,重利用的table的大小需要满足多重情况。APISIX中的表格变量都没有使用table. new 来创建,是因为大小不确定吗?

    作者回复: APISIX 里面是做了一层封装:core.table.new(),其实底层还是 table.new

    
    
  • 回家
    2019-08-25
    老师,APISIX中的load函数少个end.

    作者回复: 多谢

    
    
  • 回家
    2019-08-25
    老师,文中有这样一段话:
    也就是说,你用 table.new(narray, nhash) 生了一个长度为 100 的数组,clear 后,长度还是 100。
    哈哈,生了一个数组

    作者回复: 好眼神:)

    
    
  • 回家
    2019-08-25
    老师好,文章中提到table. new 函数属于LuaJIT的扩展,是OpenResty维护的LuaJIT分支的扩展还是就是LuaJIT的扩展?

    作者回复: 这个函数是 LuaJIT 的扩展

    
    
  • 回家
    2019-08-25
    老师,数组以空间换时间创建时,应该是没有resize 和rehash 操作的,而不是这些操作一次完成的是吧?

    作者回复: 是的,如果不超过 table.new 的预设大小,是没有这些操作的。

    
    
  • 见习勇者
    2019-08-13
    问老师,您好,我有个疑问,您举例的table复用的阶段是在init_worker阶段,这个阶段只会在初始化worker的时候调用一次,并不会影响实际的请求,有必要进行这样的优化么?对后续的请求处理有提升么?

    作者回复: 算是一个习惯了,如果是 init worker 阶段确实优化不了多少

    
    
  • helloworld
    2019-08-11
    老师,lua最大支持的数是2的53次方,那如何处理ipv6地址相关的需求呢,就是128位大数的加减乘除,比较等运算,目前lua好像都不支持,对于这种情况怎么处理比较好呢
    
    
  • dingjiayi
    2019-08-10
    温老师,有没有比较优雅的方式去切割 access.log 和 error.log
    现在我看到网上介绍的方案都是 lograte 或者crontab 启动定时任务去切割
    想请问nginx 有自带切割日志的功能吗?或者有比crontab 更优雅的方案吗

    作者回复: 你可以使用 OpenResty 的特权进程来做日志文件的切割,等于自己用 timer.every 来实现了crontab的功能。

    
    
  • 许童童
    2019-08-09
    table优化总结:
    预先定义大小:空间换时间
    table池:对象复用
    计算下标:改进算法

    作者回复: 是的,很多优化都是抠出来的

    
    
  • 阳光梦
    2019-08-09
    您好,使用标准nginx和luajit,有没有您说的这样优化方法?谢谢

    作者回复: 这里面讲的优化方法,是适用于 LuaJIT 的

     1
    
我们在线,来聊聊吧