Performance 企图";“回去”;没有goto语句

Performance 企图";“回去”;没有goto语句,performance,optimization,lua,goto,Performance,Optimization,Lua,Goto,代码示例将使用Lua,但问题相当笼统-它只是一个示例。 for k=0,100 do ::again:: local X = math.random(100) if X <= 30 then -- do something else goto again end end 相反,这个程序运行随机数生成,直到我得到所需的值。一般来说,我在这里放置了第一个示例中主循环和条件之间的所有代码 理论上,它与

代码示例将使用Lua,但问题相当笼统-它只是一个示例。

for k=0,100 do

    ::again::
    local X = math.random(100)

    if X <= 30 
    then
    -- do something
    else
        goto again       
    end

end
相反,这个程序运行随机数生成,直到我得到所需的值。一般来说,我在这里放置了第一个示例中主循环和条件之间的所有代码

理论上,它与第一个示例相同,只是没有
goto
s。但是,我不确定


主要问题:这些程序代码相等吗?他们也这么做?如果是,哪个更快(=更优化)?如果没有,区别是什么?

您可以直接使用math.random(下、上)


更快。

正如我所看到的,这段代码也是这样做的,但是使用
goto
始终不是最好的选择(在任何编程语言中)。有关lua的详细信息,请参见

使用Goto是一种不好的做法。请看

无论如何,我对Lua不太感兴趣,但这看起来很简单

对于您的第一个代码:您正在做的是启动一个循环以重复100次。在循环中,您会生成一个介于0和100之间的随机数。如果这个数字小于或等于30,你就用它做点什么。如果这个数字大于30,你就把它扔掉,得到另一个随机数。这将一直持续到您有100个随机数,这些随机数都将小于或等于30

第二个代码是:从0到100开始循环。然后将X设为100。然后用这个条件开始另一个循环:只要X大于30,就保持随机化X。只有当X小于30时,代码才会退出并执行一些操作。当它执行该操作100次时,程序结束

当然,这两种代码做的事情是一样的,但是第一种代码使用goto,这是一种不考虑效率的糟糕做法

第二个代码使用循环,但仍然没有效率-有两个级别的循环-其中一个是基于psuedo随机生成的,效率非常低(可能CPU只生成30-100之间的数字进行万亿次迭代?)。但对于您的第一段代码来说也是如此——它有一个基于psuedo随机数生成的“循环”


TLDR;严格地说,关于效率,我不认为其中一个比另一个更有效率。我可能错了,但事情似乎是一样的。

我知道,但这只是一个例子。我可以在任何条件下把任何东西放在那里。我想知道的是,这第二个代码可能是一个很好的选择,而不是
goto
s。谢谢!因为我是Lua的新手,所以我不知道这一点,但我也听说过在C语言中使用
goto
的一些问题。所以他们做的是相同的(最肯定的),而且两者都可能很慢。谢谢同样感谢您谈论“goto”,我以前听过好几次,但都不清楚,我为什么要谨慎使用它。goto位需要更多的细微差别。机器语言中充满了跳转指令。程序员为了避免跳转而学习的一些东西只是伪装的跳转,比如有限状态机模式。后藤还不错。虐待gotos的人是坏的:)也就是说,他们真的很容易被虐待。@MikeDunlavey是的,你是对的。通常情况下,如果你明白发生了什么,那么放一个goto基本上是无害的。我看到的一个经典问题是,当你放置一个并且它工作时,你会被诱导使用更多的东西——这会导致第二次和第三次转到。然后更多。这种模式会导致糟糕的意大利面代码很快变得不可读-通常正因为如此,有人将goto放在了错误的位置,如果它出现故障,尝试找出原因是困难的。请解释否决票。
for k=0,100 do

    local X = 100 -- may be put behind "for", in some cases, the matter is that we need an 'X' variable

    while X >= 30 do --IMPORTANT! it's the opposite operation of the "if" condition above!

        X = math.random(100)

    end

    -- do the same "something" as in the condition above


end
for k=0,100 do
local X = math.random(0, 30)
end