17.9 How to Optimize

I l @ ve RuBoard

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

Operation

Relative cost

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 [2]

8

Simple array index

6

Shifts

5

Add/subtract

5

Pointer dereference

2

Bitwise AND, OR, NOT

1

Logical AND, OR, NOT

1

[2] The assert statement can be removed by using the compile time option -DNDEBUG . However, these statements should be removed with care, as they provide insurance against bad things happening in your program. Sometimes the fastest way is not the best.

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.

I l @ ve RuBoard


Practical C++ Programming
Practical C Programming, 3rd Edition
ISBN: 1565923065
EAN: 2147483647
Year: 2003
Pages: 364

flylib.com © 2008-2017.
If you may any questions please contact us: flylib@qtcs.net