Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops Lua 4.01循环和变量优化_Loops_Optimization_Lua - Fatal编程技术网

Loops Lua 4.01循环和变量优化

Loops Lua 4.01循环和变量优化,loops,optimization,lua,Loops,Optimization,Lua,在Lua4.01中,第二个示例循环会比第一个更有效吗?(对不起,我不知道描述该问题的正确术语。) 还有第三个和第四个例子呢: for k = 1, 4 do bigTable[3][k] ... end local tempTable = bigTable[3] for k = 1, 4 do tempTable[k] ... end 我知道在一些脚本语言中就是这样。谢谢 [编辑] 我刚刚提出了一些测试代码来检查示例1和示例2 这表明示例#1中的getn()函

在Lua4.01中,第二个示例循环会比第一个更有效吗?(对不起,我不知道描述该问题的正确术语。)

还有第三个和第四个例子呢:

for k = 1, 4 do
    bigTable[3][k]
    ...
end

local tempTable = bigTable[3]
for k = 1, 4 do
    tempTable[k]
    ...
end
我知道在一些脚本语言中就是这样。谢谢

[编辑]

我刚刚提出了一些测试代码来检查示例1和示例2


这表明示例#1中的getn()函数只执行一次total,而不是每次循环执行一次。这是一件好事。

对于问题的第一部分,答案(见§4.4.4)很清楚:

像这样的陈述

       for var = e1 ,e2, e3 do block end
等同于代码:

       do
         local var, _limit, _step = tonumber(e1), tonumber(e2), tonumber(e3)
         if not (var and _limit and _step) then error() end
         while (_step>0 and var<=_limit) or (_step<=0 and var>=_limit) do
           block
           var = var+_step
         end
       end
do
局部变量,极限,阶跃=tonumber(e1),tonumber(e2),tonumber(e3)
如果不是(var和_limit和_step),则错误()结束

虽然(_step>0和var1 vs 2:1,虽然变化不大。3 vs 4:4肯定是4,但每个循环只有一个表访问加上
tentable
是本地的,这意味着访问速度更快。我之所以问#1 vs#2,是因为在某些语言中(JavaScript)每次遍历循环时都会执行getn位。我为#1 vs#2添加了一些测试代码。不确定如何测试#3 vs#4。不,在Lua中
循环的规范在开始时只计算一次。而要测试#3 vs#4,您唯一能做的事情就是确定所用的时间。无论如何,您会发现#4更快。
       for var = e1 ,e2, e3 do block end
       do
         local var, _limit, _step = tonumber(e1), tonumber(e2), tonumber(e3)
         if not (var and _limit and _step) then error() end
         while (_step>0 and var<=_limit) or (_step<=0 and var>=_limit) do
           block
           var = var+_step
         end
       end