Syntax 关于微优化的lua语法问题

Syntax 关于微优化的lua语法问题,syntax,lua,Syntax,Lua,因此,我试图找出在lua的语法使用之间,哪一种总体性能最好 我有3个例子,它们基本上都做相同的事情,但我想知道它们在性能方面的排名顺序: 例1 例2 例3 例4 例5 可能还有其他一些关于如何编写的变体,但基本上我只是在寻找绝对最好的性能。虽然这是一个非常简单的东西,但我正在计划重新组织目前为止我在运行的许多脚本中的每一个用法,有些脚本做一些相当复杂的工作,所以我希望尽可能地改进 别这样 尝试对其进行基准测试 尽管如此,还是不要 说真的,如果您使用的是Lua,那么就不应该在这个级别上进行优化,特

因此,我试图找出在lua的语法使用之间,哪一种总体性能最好

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

例1

例2

例3

例4

例5

可能还有其他一些关于如何编写的变体,但基本上我只是在寻找绝对最好的性能。虽然这是一个非常简单的东西,但我正在计划重新组织目前为止我在运行的许多脚本中的每一个用法,有些脚本做一些相当复杂的工作,所以我希望尽可能地改进

  • 别这样
  • 尝试对其进行基准测试
  • 尽管如此,还是不要
  • 说真的,如果您使用的是Lua,那么就不应该在这个级别上进行优化,特别是如果您对Lua的内部结构理解不够,无法自己回答这些问题的话

    不过有几点提示:

    • 如果你用的是LuaJIT,不用麻烦了。编译器比您更聪明,如果您只关注可读性和惯用Lua,而不必进行任何“优化”,那么它将使代码尽可能快地运行
    • 如果您使用的是puclua,那么您的用例可能不需要疯狂的性能,否则您将使用LuaJIT或系统编程语言
    • 相反,将重点放在更高级别的优化上。减少表分配和函数关闭会给您带来更多的性能提升,而不是您所要求的微小更改
    • 小心有关luavm的假设。
      goto
      比循环构造快,这似乎是“直观的”,因为它是一个更“低级”的东西,但Lua-VM对许多语法构造(如循环)有特殊的说明,因此它们的性能可能比普通的goto更好
    • 编写基准测试。在Lua中组合一个简单的基准测试非常容易,所以您真的应该自己测试哪些代码在真实场景中运行得更好。只需记住在几个Lua版本上运行基准测试
    • 不要优化错误的代码
    最后,将条件移出循环


    附:关于提问的说明

    询问性能时,务必给出真实的数字或说明其范围。当变量可以随时间变化时,对其进行注释或添加一些伪代码来更改它们

    按照你提问的方式,天真的答案是:

    如果测试
    打印(“测试”)打印(“测试”)打印(“测试”)
    结束
    
    这甚至都不会错

  • 别这样
  • 尝试对其进行基准测试
  • 尽管如此,还是不要
  • 说真的,如果您使用的是Lua,那么就不应该在这个级别上进行优化,特别是如果您对Lua的内部结构理解不够,无法自己回答这些问题的话

    不过有几点提示:

    • 如果你用的是LuaJIT,不用麻烦了。编译器比您更聪明,如果您只关注可读性和惯用Lua,而不必进行任何“优化”,那么它将使代码尽可能快地运行
    • 如果您使用的是puclua,那么您的用例可能不需要疯狂的性能,否则您将使用LuaJIT或系统编程语言
    • 相反,将重点放在更高级别的优化上。减少表分配和函数关闭会给您带来更多的性能提升,而不是您所要求的微小更改
    • 小心有关luavm的假设。
      goto
      比循环构造快,这似乎是“直观的”,因为它是一个更“低级”的东西,但Lua-VM对许多语法构造(如循环)有特殊的说明,因此它们的性能可能比普通的goto更好
    • 编写基准测试。在Lua中组合一个简单的基准测试非常容易,所以您真的应该自己测试哪些代码在真实场景中运行得更好。只需记住在几个Lua版本上运行基准测试
    • 不要优化错误的代码
    最后,将条件移出循环


    附:关于提问的说明

    询问性能时,务必给出真实的数字或说明其范围。当变量可以随时间变化时,对其进行注释或添加一些伪代码来更改它们

    按照你提问的方式,天真的答案是:

    如果测试
    打印(“测试”)打印(“测试”)打印(“测试”)
    结束
    

    它甚至不会错。

    如果不是test\u var,那么
    的性能与
    如果test\u var,那么
    什么样的Lua环境和版本?5.1(我认为是5.2),但它是为游戏garry的mod设计的,所以它有一些额外的修改(一些被添加为continue,!and | | |的运算符。它也使用JIT)@EgorSkriptunoff:我在那里看到一个额外的运算符。luac在看到
    if not
    时是否做了某种快捷方式?
    if not test_var则
    if test_var则
    什么Lua环境和版本?5.1(我想,否则是5.2)但它是为游戏garry的mod做的,所以它有一些额外的修改(一些被添加为continue,!和| |。它也使用JIT)@EgorSkriptunoff:我在那里看到了一个额外的操作符。luac看到
    如果没有
    ,是否会做一些快捷方式?问题是,从技术上来说,这是一款名为garry's mod的游戏,它不仅为诸如not/或者continue之类的东西添加了其他操作符,而且它也已经使用了LuaJIT。但是除了facepunch之外,没有人可以访问它这其中的大部分已经足够接近了,实际上很难得到任何更优化的明确信号
    
    local test_var = true
    for i = 1,3 do
        if test_var then
            return
        end
        print('test')
    end
    
    local test_var = true
    for i = 1,3 do
        if test_var then
            break
        end
        print('test')
    end
    
    local test_var = false
    for i = 1,3 do
        if not test_var then
            return
        end
        print(test)
    end
    
    local test_var = false
    for i = 1,3 do
        if not test_var then
            goto continue
        end
        print('test')
        ::continue::
    end
    
    local test_var = false
    for i = 1,3 do
        if test_var then
            print('test')
        end
    end