lua语法问题关于微优化

我正在尝试弄清楚在lua语法使用方面哪种方法的性能最好。

我有3个示例,它们基本上都是做同样的事情,但我想知道它们的性能排名是什么:

示例1:

local test_var = true
for i = 1,3 do
    if test_var then
        return
    end
    print('test')
end

示例2:

local test_var = true
for i = 1,3 do
    if test_var then
        break
    end
    print('test')
end

示例3:

local test_var = false
for i = 1,3 do
    if not test_var then
        return
    end
    print(test)
end

示例4:

local test_var = false
for i = 1,3 do
    if not test_var then
        goto continue
    end
    print('test')
    ::continue::
end

示例5:

local test_var = false
for i = 1,3 do
    if test_var then
        print('test')
    end
end

可能还有其他几种写法,但基本上我只是想知道从性能角度来看哪种方式是最好的。虽然这是相当简单的东西,但它是用于我正在运行的许多脚本中的,并且有些脚本做了一些相当复杂的工作,所以我希望尽可能地提高性能。

点赞
用户4984564
用户4984564
  1. 就是别优化了
  2. 尝试进行基准测试
  3. 但是,还是别优化了

说真的,如果你在使用 Lua,尤其是如果你不理解其内部工作原理的话,你不应该试图在那个层面上进行优化。

不过还是有一些提示:

  • 如果你使用的是 LuaJIT,就别折腾了。编译器比你聪明,如果你只专注于可读性和惯用的 Lua 代码,它会尽可能的让代码运行得更快,而不需要进行任何“优化”之类的东西。
  • 如果你使用的是 PUC Lua,你的使用场景可能本来就不需要特别高的性能,否则你就应该使用 LuaJIT 或者系统编程语言了。
  • 集中精力进行高级别的优化。减少表分配和函数关闭比你提出的微小的改动可以带来更大的性能提升。
  • 对 Lua 虚拟机的假设要小心。你可能认为,goto 比循环构造更快是“直觉”上更符合逻辑的,因为这是一个更“低级别”的东西,但是对于许多语法构造,如 for 循环,Lua VM 都有特殊的指令,因此它们可能比纯粹的 goto 指令执行得更好。
  • 编写基准测试。在 Lua 中编写一个简单的基准测试非常容易,所以你应该测试一下在实际情况下哪些代码运行得更好。只要记得在几个 Lua 版本上运行基准测试即可。
  • 不要优化错误的代码。

最后,将条件移到循环外面。


PS:关于提问的一点说明

在询问性能方面的问题时,请提供实际的数字或注释它们的范围。当变量可能随时间变化时,请注释或添加一些虚拟代码来改变它们。

以你提出问题的方式,一个简单的答案可能是:

if test_var then
   print("test") print("test") print("test")
end

虽然这样并没有错。

2020-06-29 17:17:06