网上有大量对 Lua 调优的推荐,我们应该如何看待?

    需要各位看官注意的是,OpenResty 最新版默认已经绑定 LuaJIT,优化手段和方法已经略有不同。我们现在的做法是:代码易读是首位,目前还没有碰到同样代码换个写法就有质的提升,如果我们对某个单点功能有性能要求,那么建议用 LuaJIT 的 FFI 方法直接调用 C 接口更直接一点。

    针对这篇文章内容写了一些测试代码:

    1. local function sum( ... )
    2. local args = {...}
    3. local a = 0
    4. for k,v in pairs(args) do
    5. a = a + v
    6. end
    7. return a
    8. end
    9. local function test_unit()
    10. -- t1: 0.340182 s
    11. -- local a = {}
    12. -- for i = 1,1000 do
    13. -- table.insert( a, i )
    14. -- end
    15. -- t2: 0.332668 s
    16. -- local a = {}
    17. -- for i = 1,1000 do
    18. -- a[#a+1] = i
    19. -- end
    20. -- local a = {}
    21. -- local index = 1
    22. -- for i = 1,1000 do
    23. -- a[index] = i
    24. -- index = index+1
    25. -- end
    26. -- p1: 0.708012 s
    27. -- local a = 0
    28. -- for i=1,1000 do
    29. -- local t = { 1, 2, 3, 4 }
    30. -- for i,v in ipairs( t ) do
    31. -- a = a + v
    32. -- end
    33. -- end
    34. -- p2: 0.660426 s
    35. -- local a = 0
    36. -- for i=1,1000 do
    37. -- local t = { 1, 2, 3, 4 }
    38. -- for i = 1,#t do
    39. -- a = a + t[i]
    40. -- end
    41. -- u1: 2.121722 s
    42. -- local a = { 100, 200, 300, 400 }
    43. -- local b = 1
    44. -- for i = 1,1000 do
    45. -- b = sum(unpack(a))
    46. -- end
    47. -- u2: 1.701365 s
    48. -- local a = { 100, 200, 300, 400 }
    49. -- local b = 1
    50. -- for i = 1,1000 do
    51. -- b = sum(a[1], a[2], a[3], a[4])
    52. -- end
    53. return b
    54. end
    55. for i=1,10 do
    56. for j=1,1000 do
    57. test_unit()
    58. end
    59. end
    60. print(os.clock()-start)

    另外说明:文章提及的使用局部变量、缓存 table 元素,在 LuaJIT 中还是很有用的。