17.9 How to Optimize
Our matrix initialization function illustrates several optimizing
strategies. These are:
- Removing invariant code
-
Code that does not need to be put inside a loop should be put outside
the loop. For example:
for (i = 0; i < 10; ++i)
matrix[i] = i + j * 10;
can be written as:
j_times_10 = j * 10;
for (i = 0; i < 10; ++i)
matrix[i] = i + j_times_10;
for (i = 0; i < 10; ++i)
Most good optimizing compilers will do this work for you if possible.
- Loop ordering
-
Nested loops should be ordered with
the
simplest
loop outermost and the most complex loops innermost.
- Reference parameters
-
Use constant reference parameters (const
type&)
instead of constant parameters for structures, unions, and
classes.
- Powers of two
-
Use a power of two when doing integer multiply or divide. Most
compilers will substitute a shift for the operation.
- Pointers
-
Using
pointers to go through an array is generally faster using an index,
but pointers are more tricky to use.
- Inline functions
-
Using inline functions eliminates the overhead associated with a
function call. It also can make the code bigger and a little more
difficult to debug. (See the case study below.)
- Reduction in strength
-
This is a fancy way of saying use cheap
operations instead of expensive ones. Table 17-1
lists the relative cost of common operations.
Table 17-1. Relative cost of operations
File input and output (<< and
>>), including the C functions
printf and scanf
|
1,000
|
new and delete
|
800
|
Trigonometric functions (sin, cos, ...)
|
500
|
Floating point (any operation)
|
100
|
Integer divide
|
30
|
Integer multiply
|
20
|
Function call
|
10
|
assert
|
8
|
Simple array index
|
6
|
Shifts
|
5
|
Add/subtract
|
5
|
Pointer dereference
|
2
|
Bitwise AND, OR, NOT
|
1
|
Logical AND, OR, NOT
|
1
|
 |
The C++ I/O system and the C formatting functions called using
std::scanf, std::printf, and
std::sscanf are extremely costly because they have
to go through the format string one character at a time looking for a
format conversion character (%). They then have to
do a costly conversion between a character string and a number. These
functions should be avoided in time-critical sections of code.
|
|
|