关于微优化的lua语法问题

Rap*_*rks 1 syntax lua

所以我试图找出 lua 语法使用之间哪种整体性能最好。

我有 3 个示例,它们基本上都做同样的事情,但我想知道它们在性能方面的排名顺序:

前1.

local test_var = true
for i = 1,3 do
    if test_var then
        return
    end
    print('test')
end
Run Code Online (Sandbox Code Playgroud)

前任。2

local test_var = true
for i = 1,3 do
    if test_var then
        break
    end
    print('test')
end
Run Code Online (Sandbox Code Playgroud)

前任。3

local test_var = false
for i = 1,3 do
    if not test_var then
        return
    end
    print(test)
end
Run Code Online (Sandbox Code Playgroud)

前任。4

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

前任。5

local test_var = false
for i = 1,3 do
    if test_var then
        print('test')
    end
end
Run Code Online (Sandbox Code Playgroud)

可能还有一些其他的编写方式,但基本上我只是在寻找绝对最佳性能的方法。虽然这是非常简单的东西,但它的用途是我计划重新组织迄今为止在我正在运行的许多脚本中的每一个用法,有些脚本做了一些相当复杂的工作,所以我希望尽可能地改进事情

Dar*_*yer 5

  1. 只是不要
  2. 尝试对其进行基准测试
  3. 仍然,只是不要

说真的,如果您使用 Lua,您不应该尝试在该级别上进行优化,特别是如果您对内部结构的了解不足以自己回答这些问题。

不过有一些提示:

  • 如果您正在使用 LuaJIT,请不要打扰。编译器比你聪明,如果你只关注可读性和惯用的 Lua,而不需要做任何无意义的“优化”,编译器就会让代码尽可能快地运行。
  • 如果您使用 PUC Lua,那么您的用例可能并不需要疯狂的性能,否则您将使用 LuaJIT 或系统编程语言。
  • 相反,专注于更高级别的优化。减少表分配和函数关闭比您所要求的微小更改更能提高性能。
  • 请小心有关 Lua VM 的假设。它可能看起来“直观” goto,比循环构造更快,因为它是一个更“低级”的东西,但是 Lua VM 对于许多语法构造(例如 for 循环)有特殊指令,因此它们很可能比普通的 goto 执行得更好
  • 编写基准。在 Lua 中构建一个简单的基准测试非常容易,因此您实际上应该自己测试哪些代码在现实场景中运行得更好。只需记住在多个 Lua 版本上运行基准测试即可。
  • 不要优化错误的代码。

最后,只需将条件移出循环即可。


PS:关于提问的注意事项

当询问性能时,请始终给出实际的数字或评论其范围。当变量可以随时间变化时,对其进行注释或添加一些虚拟代码来更改它们。

根据您提出问题的方式,天真的答案是:

if test_var then
   print("test") print("test") print("test")
end
Run Code Online (Sandbox Code Playgroud)

这甚至不会是错误的。