cache behavior is a topic mentioned throughout the course. array
traversal is an easy way to see how caches can dramatically affect
performance.

in this example, a two-dimensional array is traversed twice, first
by row, then by column, then again, first by column, then by row.
depending on the cache size, array size, and language implementation
of array allocation, one or the other of these traversals will
be noticably slower.

this slowness is due to the fact that each access (for example, given
our implementation of c++ on some unix platforms) which crosses
an array row falls out of cache, incurring a round-trip-to-memory
performance cost. though this may be mitigated by certain architectures
cache implementation, the effect will still be noticible.

