尝试在没有goto语句的情况下“返回”

时间:2013-08-16 13:06:22

标签: 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

此代码在0-30之间生成100个伪随机数。它应该在0-100之间进行,但如果其中任何一个大于30,则不会让循环继续。

我尝试在没有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

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

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

主要问题:这些程序代码是否相同?他们做同样的事情?如果是,哪个更快(=更优化)?如果不是,有什么区别?

3 个答案:

答案 0 :(得分:1)

使用Goto是不好的做法。请参阅http://xkcd.com/292/

无论如何,我对Lua并不多,但这看起来很简单;

对于你的第一个代码:你正在做的是开始循环重复100次。在循环中,您可以在0到100之间创建一个随机数。如果此数字小于或等于30,则使用它执行某些操作。如果此数字大于30,则实际将其丢弃并获得另一个随机数。这种情况一直持续到你有100个随机数,其中ALL将小于或等于30。

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

当然,两个代码都做同样的事情,但第一个使用goto - 这无论效率如何都是不好的做法。

第二个代码使用循环,但仍然没有效率 - 有两个级别的循环 - 一个基于伪随机生成,这可能是非常低效的(可能CPU只产生30-100之间的数字万亿迭代?)然后事情变得非常缓慢。但是对于你来说,第一段代码也是如此 - 它有一个基于伪随机数生成的'循环'。

TLDR;严格来说,效率,我没有看到其中一个效率高于另一个。我可能错了,但似乎情况正在发生。

答案 1 :(得分:0)

你可以直接使用math.random(lower,upper)

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

更快。

答案 2 :(得分:0)

正如我所看到的,这些代码片段也是如此,但使用goto始终不是最佳选择(在任何编程语言中)。对于lua,请参阅详细信息here