2016-07-02 6 views
1

In Lua 4.01, wird die zweite Beispielschleife effizienter sein als die erste? (Sorry, ich weiß nicht, die richtige Terminologie das Problem zu beschreiben.)Lua 4.01 Schleifen und Variablen Optimierung

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

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

Auch was ist der dritte im Vergleich zu den vierten Beispiele:

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

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

ich in einigen Skriptsprachen weiß, das ist die Fall. Vielen Dank.

[Bearbeiten]

Ich kam gerade mit einigen Testcode auf Beispiele 2 # 1 vs # zu überprüfen. Diese

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

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

zeigt, dass die GetN() Funktion in Beispiel # 1 nur einmal ausgeführt wird insgesamt statt einmal pro Schleife. Das ist eine gute Sache.

+0

1 vs 2: 1, obwohl es nicht viel ändert. 3 vs 4: definitiv 4, nur ein Tabellenzugriff pro Schleife plus 'tempTable' ist lokal, was bedeutet, dass der Zugriff schneller ist. – user6245072

+0

Der Grund, warum ich nach # 1 vs # 2 frage, ist, dass in einigen Sprachen (JavaScript) das getn-Bit * jedes Mal * ausgeführt wird, wenn die Schleife durchlaufen wird. – posfan12

+0

Ich habe einen Testcode für # 1 vs # 2 hinzugefügt. Nicht sicher, wie man # 3 vs # 4 testet. – posfan12

Antwort

2

Für den ersten Teil der Frage, die manual (siehe §4.4.4) ist klar:

A für Aussage wie

 for var = e1 ,e2, e3 do block end 

zu dem Code entspricht:

 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 

Sowohl der Grenzwert als auch der Schritt werden nur einmal ausgewertet, bevor die Schleife startet.