Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is it better to declare a local inside or outside a loop? [duplicate]

I am used to do this:

do
    local a
    for i=1,1000000 do
        a = <some expression>
        <...> --do something with a
    end
end

instead of

for i=1,1000000 do
    local a = <some expression>
    <...> --do something with a
end

My reasoning is that creating a local variable 1000000 times is less efficient than creating it just once and reuse it on each iteration.

My question is: is this true or there is another technical detail I am missing? I am asking because I don't see anyone doing this but not sure if the reason is because the advantage is too small or because it is in fact worse. By better I mean using less memory and running faster.

like image 854
Mandrill Avatar asked Jun 27 '15 00:06

Mandrill


People also ask

Should you declare variables inside or outside a loop?

Declaring variables inside or outside of a loop, It's the result of JVM specifications But in the name of best coding practice it is recommended to declare the variable in the smallest possible scope (in this example it is inside the loop, as this is the only place where the variable is used).

Is it OK to declare a variable inside a for loop?

Often the variable that controls a for loop is needed only for the purposes of the loop and is not used elsewhere. When this is the case, it is possible to declare the variable inside the initialization portion of the for.

Are local variables made inside a loop destroyed?

1 Answer. Show activity on this post. At the end of each loop iteration, the variable goes out of scope and ceases to exist. That doesn't mean assigning a special value (such as null ) to it; it just means that the memory is available to be used by other things.

Are local variables more efficient?

Local variables can be faster because the optimizer can store them in registers. In C++ in general, you can't make a statement about the performance difference.


1 Answers

Like any performance question, measure first. In a unix system you can use time:

time lua -e 'local a; for i=1,100000000 do a = i * 3 end'
time lua -e 'for i=1,100000000 do local a = i * 3 end'

the output:

 real   0m2.320s
 user   0m2.315s
 sys    0m0.004s

 real   0m2.247s
 user   0m2.246s
 sys    0m0.000s

The more local version appears to be a small percentage faster in Lua, since it does not initialize a to nil. However, that is no reason to use it, use the most local scope because it it is more readable (this is good style in all languages: see this question asked for C, Java, and C#)

If you are reusing a table instead of creating it in the loop then there is likely a more significant performance difference. In any case, measure and favour readability whenever you can.

like image 95
ryanpattison Avatar answered Sep 28 '22 06:09

ryanpattison