Furthermore, features interact in essentially unpredictable ways. For example, a machine might have hardware support for texture mapping, but only for some texture sizes. Or depth buffering might be fast only as long as sufficient memory is available after loading textures. And so on. Since the performance of a section of graphics code is dependent on dozens of pieces of information from the runtime environment, no other method is as well-defined and reliable.
Performance measurement can be tricky.
You need to flush the graphics pipeline properly, and account for timer granularity and measurement overhead. Therefore you'll want to save performance measurements and reuse them whenever possible. Disk and network throughput, processing time for a particular set of data, performance on uniprocessor and multiprocessor systems. This document describes two libraries that can help with all of the tasks just mentioned. These libraries aren't a substitute for comprehensive benchmarking and performance analysis, but they can handle simple tasks easily.