written 8.4 years ago by | • modified 8.4 years ago |
Optimization
- Optimization is a program transformation technique, which tries to improve the code by making it consume less resources (i.e. CPU, Memory) and deliver high speed.
- In optimization, high-level general programming constructs are replaced by very efficient low-level programming codes.
- A code optimizing process must follow the three rules given below:
- The output code must not, in any way, change the meaning of the program.
- Optimization should increase the speed of the program and if possible, the program should demand less number of resources.
- Optimization should itself be fast and should not delay the overall compiling process.
- Efforts for an optimized code can be made at various levels of compiling the process.
- At the beginning, users can change/rearrange the code or use better algorithms to write the code.
- After generating intermediate code, the compiler can modify the intermediate code by address calculations and improving loops.
- While producing the target machine code, the compiler can make use of memory hierarchy and CPU registers.
Optimization can be categorized broadly into two types:
Machine Independent and Machine Dependent.
Machine Independent Optimization
- In this optimization, the compiler takes in the intermediate code and transforms a part of the code that does not involve any CPU registers and/or absolute memory locations.
For example:
do { item = 10; value = value + item; } while(value<100);
This code involves repeated assignment of the identifier item, which if we put this way:
Item = 10; do { value = value + item; } while(value<100);
should not only save the CPU cycles, but can be used on any processor.
Machine Dependent Optimization
- Machine-dependent optimization is done after the target code has been generated and when the code is transformed according to the target machine architecture.
- It involves CPU registers and may have absolute memory references rather than relative references.
- Machine-dependent optimizers put efforts to take maximum advantage of memory hierarchy.
Machine independence includes two types
1. Function Preserving
2. Loop optimization
1. Loop Optimization
Most programs run as a loop in the system. It becomes necessary to optimize the loops in order to save CPU cycles and memory. Loops can be optimized by the following techniques:
Invariant code: A fragment of code that resides in the loop and computes the same value at each iteration is called a loop-invariant code. This code can be moved out of the loop by saving it to be computed only once, rather than with each iteration.
Induction analysis: A variable is called an induction variable if its value is altered within the loop by a loop-invariant value.
Strength reduction: There are expressions that consume more CPU cycles, time, and memory. These expressions should be replaced with cheaper expressions without compromising the output of expression. For example, multiplication (x * 2) is expensive in terms of CPU cycles than (x << 1) and yields the same result.
We are going to perform optimization on loops.
Code Motion
It specifies on a condition if we perform some operations to be carried out and then compare for a condition.
Instead of that perform the calculation outside the loop and assign a value in the calculation.
BO | AO |
---|---|
While(i < = limit-2) { ….. …… …. } |
T1 = limit – 2 While (i< =t1) { ………………… ………… …………. } |
Strength Reduction
It specifies the operators such as multiplication and division can be replaced by a addition and subtraction respectively.
The multiplication operator can be easily replaced by left shift operator a<<1 Division can be replaced by a a>>1 operator.
BO | AO |
---|---|
T1 = a * 2 | a<<1 |
T1 = a / 2 | a >> 1 |
Frequency Reduction
In this case if a expression inside a loop is not dynamically affected by a loop we calculate it outside the loop and use the value inside the loop.
BO | AO |
---|---|
While(i<=limit) { T1=a4; T2=it1; } |
T1=a4; While(i<=limit) { T2= i t1; } |
Loop Distribution
It specifies the values in a particular loop to be assigned to a array keeps of varying i.e the array location in which a loop need to be work again and again. We can use two different loops which allows loop distribution