Why infinite loops are faster than finite loops?
Johan
j at j.nl
Sun Jun 21 13:00:18 UTC 2020
On Saturday, 20 June 2020 at 21:11:57 UTC, tastyminerals wrote:
> I am not sure that this is a question about D or a more general
> one. I have watched this nice presentation "Speed Is Found In
> The Minds of People" by Andrei:
> https://www.youtube.com/watch?v=FJJTYQYB1JQ&feature=youtu.be?t=2596 and on 43:20 he says that "push_heap" is slow because of structured loops and finite for (throughout the presentation Andrei shows algorithm examples with infinite loops). I wonder why is that?
Is it because the finite loop needs to keep track of the number
of iterations it performs?
Yes, indeed. Simple way of looking at it is that for the
'infinite' loop, each loop checks for N exit conditions, whereas
the 'finite' loop checks for N+1 conditions. The extra check (and
calculating the extra condition) of the 'finite' loop is what can
lead to noticable performance drop. For example in the case of
linear search, the work of inserting a 'sentinel' at the end and
some extra logic can outweigh the work of 'length' check upon
each loop iteration. It is a highly predictable branch though, so
perf cost may be very small depending on the architecture. If you
like this kind of stuff you should play with code and llvm-mca.
See https://youtu.be/Czr5dBfs72U?t=2352 for an introduction to
it. llvm-mca is available on https://d.godbolt.org.
> Wouldn't the compiler optimize it better than the infinite one
> because it knows the number of iterations the for loop needs?
Both "infinite" and "finite" loop are, in fact, finite. For both
cases, the number of iterations often depends on runtime
parameters and is thus unknown to the compile-time optimizer.
Even if the number of iterations is known exactly, there aren't
really any optimizations one can do that would help performance
(except when the number of iterations is really small, like < 10
or so).
-Johan
More information about the Digitalmars-d-learn
mailing list