Aussie AI
Lazy Evaluation
-
Book Excerpt from "Generative AI in C++"
-
by David Spuler, Ph.D.
Lazy Evaluation
The idea of lazy evaluation is a slight amendment to precalculation or data structure augmentation. Full precomputation during program startup can be inefficient if only some of the values are needed.
Lazy evaluation works in a “lazy” manner, by only doing work when asked. Instead of precalculating every result, results are calculated only as needed. To use this method, some way is needed of indicating whether a result is already in the table. When seeking a result, it is necessary to check if the required value is already present. If so, table lookup is used to get the result. If not, the value must be calculated, stored in the table and that entry marked as present.
The precomputation of sqrtf
can be modified to become lazy
evaluation by adding another array of Boolean flags, indicating which of the square roots
have been computed. When calculating a square root, the function checks if it has been
computed, and calculates it if not.
float square_root_lazy_eval(int n) { static float sqrt_table[NUM_PREC + 1]; // values static bool precalc[NUM_PREC + 1]; // flags if (!precalc[n]) { // precalculated? sqrt_table[n] = sqrtf((float)n); // real sqrt precalc[n] = true; // Mark as computed } return sqrt_table[n]; }
The use of lazy evaluation is slower than complete precalculation if all of the values are eventually calculated, because of the overhead of checking whether calculation is needed. Also, there's only an efficiency gain for values that are calculated twice or more. However, lazy evaluation can make the program faster overall if not all calculations are needed, but some are needed many times. Any unnecessary calculations are avoided. How lazy!
• Next: • Up: Table of Contents |
The new AI programming book by Aussie AI co-founders:
Get your copy from Amazon: Generative AI in C++ |