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.
|
|
|
No comments:
Post a Comment