17.11 Case Study: Optimizing a Color-Rendering Algorithm
I once was asked to optimize a program that did color rendering for a
large picture. The problem was that the program took eight hours to
process a single picture. This limited us to doing one picture a day.
The first thing I did was run the program on a machine with a
floating-point accelerator. This brought the time down to about six
hours. Next I got permission to use a high-speed RISC computer that
belonged to another project but was currently sitting idle. That
reduced the time to two hours.
I saved six hours solely by using faster machines. No code had
changed yet.
Two fairly simple functions were being called only once from the
innermost loop. Rewriting these functions as macros saved about 15
minutes.
Next I changed all the floating-point
operations I could from floating-point to integer. The savings
amounted to 30 minutes out of a 1:45 run.
Then I noticed the program was spending about 5 minutes reading an
ASCII file containing a long list of floating-point numbers used in
the conversion process. Knowing that scanf is an
extremely expensive function, I cut the initialization process down
to almost nothing by making the file binary. Total runtime was now
down to 1:10.
By carefully inspecting the code and using every trick I knew, I
saved another 5 minutes, leaving me 5 minutes short of my goal of an
hour per run. At this point my project was refocused and the program
put in mothballs for use at some future date.
|