In section~#secchoice#37387> we discussed the differences between a
structurally recursive program and an equivalent, generative version. The
comparison revealed that the generative one is much faster than the
structural version. We used both informal arguments, using the number of
recursive calls, and measurements, using <#66953#><#37388#>time<#37388#><#66953#> expressions
(exercises~#exgcdstructtime#37389> and~#exgcdgentime#37390>), to support
our conclusion.
While timing the application of a program to specific arguments can help us
understand a program's behavior in one situation, it is not a fully
convincing argument. After all, applying the same program to some other
inputs may require a radically different amount of time. In short, timing
programs for specific inputs has the same status as testing programs for
specific examples. Just as testing may reveal bugs, timing may reveal
anomalies concerning the execution behavior for specific inputs. It does
not provide a firm foundation for general statements about the behavior of
a program.
This intermezzo introduces a tool for making general statements about the
time that programs take to compute a result. The first subsection motivates
the tool and illustrates it with several examples, though on an informal
basis. The second one provides a rigorous definition. The last one uses the
tool to motivate an additional class of Scheme data and some of its basic
operations.