A loop invariant is a piece of information that does not change within the body of a control structure.
If calculating a loop invariant is expensive, then caching the result of the calculation outside of the loop can improve performance. Loop invariants are one of the first options considered for increasing run-time performance. However, caching the loop invariant will not change the computation complexity of the loop.
Here is an example.
Imagine that you want to loop through a twenty element array and check to see if any of the elements are equal to e * pi ^ 2.
for i = 0 .. 19
if elementi = Math.e() * Math.pi() * Math.pi() then
print "Match found."
end if
end for loop
In this example, the invariant is Math.e()*Math.pi()*Math.pi() . This has a cost of two multiplies and three function calls, each of which may actually do the work of calculating e and pi, which is very expensive.
Obviously, this amount will not change in the loop.*
So we can achieve a performance increase by caching the results of this calculation outside of the loop. Let's use a variable to store this value, and call it eTimesPiTimesPi. **
var eTimesPiTimesPi = Math.e() * Math.pi() * Math.pi();
for i = 0 .. 19
if elementi = eTimesPiTimesPi then
print "Match found."
end if
end for loop
This has an immediate effect on the run-time speed, with no actual modification of the algorithm necessary. The costs associated with this approach are time and code clarity.
* (in fact, it will never change, but that's a different story.)
** I like to use descriptive variable names like this, but you may wish to use a shorter variable name like epp.