2016-07-02 3 views
1

В Lua 4.01 второй цикл цикла будет более эффективным, чем первый? (К сожалению, я не знаю правильную терминологию, чтобы описать проблему.)Оптимизация лупов и переменных Lua 4.01

for k = 1, getn(myTable) do 
    ... 
end 

local numTable = getn(myTable) 
for k = 1, numTable do 
    ... 
end 

И что насчет третьего по сравнению с четвертым примеров:

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

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

Я знаю, что в некоторых языках сценариев это дело. Благодарю.

[править]

Я только что пришел с какой-то тестовый код, чтобы проверить примеры # 1 против # 2.

function Return_a_Number() 
    print("############# I am looping.") 
    return 5 
end 

for i = 1, Return_a_Number() do 
    -- do nothing 
end 

Это показывает, что функция ГЕТН() в примере № 1 выполняется только один раз, а не всего один раз за цикл. Это хорошая вещь.

+0

1 против 2: 1, хотя это не так сильно изменилось. 3 против 4: определенно 4, только один доступ к таблице за цикл плюс «tempTable» является локальным, что означает, что доступ к нему выполняется быстрее. – user6245072

+0

Причина, по которой я спрашиваю о № 1 против № 2, заключается в том, что на некоторых языках (JavaScript) бит getn будет выполняться * каждый раз, когда цикл перемещается. – posfan12

+0

Я добавил код для # 1 против # 2. Не знаете, как протестировать # 3 против №4. – posfan12

ответ

2

Для первой части вопроса, то manual (см §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 

Оба предела и шаг оцениваются только один раз, до начала цикла.

Смежные вопросы