Code Tuning Techniques CPSC 315 – Programming Studio Spring 2008 Most examples from Code Complete...
-
date post
15-Jan-2016 -
Category
Documents
-
view
222 -
download
0
Transcript of Code Tuning Techniques CPSC 315 – Programming Studio Spring 2008 Most examples from Code Complete...
![Page 1: Code Tuning Techniques CPSC 315 – Programming Studio Spring 2008 Most examples from Code Complete 2.](https://reader035.fdocuments.us/reader035/viewer/2022062423/56649d6a5503460f94a48910/html5/thumbnails/1.jpg)
Code Tuning Techniques
CPSC 315 – Programming Studio
Spring 2008
Most examples fromCode Complete 2
![Page 2: Code Tuning Techniques CPSC 315 – Programming Studio Spring 2008 Most examples from Code Complete 2.](https://reader035.fdocuments.us/reader035/viewer/2022062423/56649d6a5503460f94a48910/html5/thumbnails/2.jpg)
Tuning Code
Can be at several “levels” of code Routine to system
No “do this and improve code” technique Same technique can increase or decrease
performance, depending on situation Must measure to see what effect is
Remember:
Tuning code can make it harder to understand and maintain!
![Page 3: Code Tuning Techniques CPSC 315 – Programming Studio Spring 2008 Most examples from Code Complete 2.](https://reader035.fdocuments.us/reader035/viewer/2022062423/56649d6a5503460f94a48910/html5/thumbnails/3.jpg)
Tuning Code
We’ll describe several categories of tuning, and several specific casesLogical ApproachesTuning LoopsTransforming DataTuning ExpressionsOthers
![Page 4: Code Tuning Techniques CPSC 315 – Programming Studio Spring 2008 Most examples from Code Complete 2.](https://reader035.fdocuments.us/reader035/viewer/2022062423/56649d6a5503460f94a48910/html5/thumbnails/4.jpg)
Logical Approaches:Stop Testing Once You Know the
AnswerShort-Circuit Evaluationif ((a > 1) and (a < 4))
if (a > 1)
if (a < 4) Note: Some languages (C++/Java) do this
automatically
![Page 5: Code Tuning Techniques CPSC 315 – Programming Studio Spring 2008 Most examples from Code Complete 2.](https://reader035.fdocuments.us/reader035/viewer/2022062423/56649d6a5503460f94a48910/html5/thumbnails/5.jpg)
Logical Approaches:Stop Testing Once You Know the
AnswerBreaking out of “Test Loops”flag = False;for (i=0; i<10000; i++) if (a[i] < 0) flag = True;
Several options:Use a break command (or goto!)Change condition to check for FlagSentinel approach
![Page 6: Code Tuning Techniques CPSC 315 – Programming Studio Spring 2008 Most examples from Code Complete 2.](https://reader035.fdocuments.us/reader035/viewer/2022062423/56649d6a5503460f94a48910/html5/thumbnails/6.jpg)
Logical Approaches:Order Tests by Frequency
Test the most common case first Especially in switch/case statements Remember, compiler may reorder, or not short-
circuitNote: it’s worthwhile to compare performance of logical structures Sometimes case is faster, sometimes if-then
Generally a useful approach, but can potentially make tougher-to-read code Organization for performance, not understanding
![Page 7: Code Tuning Techniques CPSC 315 – Programming Studio Spring 2008 Most examples from Code Complete 2.](https://reader035.fdocuments.us/reader035/viewer/2022062423/56649d6a5503460f94a48910/html5/thumbnails/7.jpg)
Logical Approaches:Use Lookup Tables
Table lookups can be much faster than following a logical computation
Example: diagram of logical values:
1 1 BA
1
C
2
2
3
2
0
![Page 8: Code Tuning Techniques CPSC 315 – Programming Studio Spring 2008 Most examples from Code Complete 2.](https://reader035.fdocuments.us/reader035/viewer/2022062423/56649d6a5503460f94a48910/html5/thumbnails/8.jpg)
Logical Approaches:Use Lookup Tables
if ((a && !c) || (a && b && c)) {
val = 1;
} else if ((b && !a) || (a && c && !b)) {
val = 2;
} else if (c && !a && !b) {
val = 3;
} else {
val = 0;
}
1 1 BA
1
C
2
2
3
2
0
![Page 9: Code Tuning Techniques CPSC 315 – Programming Studio Spring 2008 Most examples from Code Complete 2.](https://reader035.fdocuments.us/reader035/viewer/2022062423/56649d6a5503460f94a48910/html5/thumbnails/9.jpg)
Logical Approaches:Use Lookup Tables
static int valtable[2][2][2] = {
// !b!c !bc b!c bc
0, 3, 2, 2, // !a
1, 2, 1, 1, // a
};
val = valtable[a][b][c] 1 1 BA
1
C
2
2
3
2
0
![Page 10: Code Tuning Techniques CPSC 315 – Programming Studio Spring 2008 Most examples from Code Complete 2.](https://reader035.fdocuments.us/reader035/viewer/2022062423/56649d6a5503460f94a48910/html5/thumbnails/10.jpg)
Logical Approaches:Lazy Evaluation
Idea: wait to compute until you’re sure you need the valueOften, you never actually use the value!
Tradeoff overhead to maintain lazy representations vs. time saved on computing unnecessary stuff
![Page 11: Code Tuning Techniques CPSC 315 – Programming Studio Spring 2008 Most examples from Code Complete 2.](https://reader035.fdocuments.us/reader035/viewer/2022062423/56649d6a5503460f94a48910/html5/thumbnails/11.jpg)
Tuning Loops:Unswitching
Remove an if statement unrelated to index from inside loop to outsidefor (i=0; i<n; i++) if (type == 1) sum1 += a[i]; else sum2 += a[i];
if (type == 1) for (i=0; i<n; i++) sum1 += a[i];else for (i=0; i<n; i++) sum2 += a[i];
![Page 12: Code Tuning Techniques CPSC 315 – Programming Studio Spring 2008 Most examples from Code Complete 2.](https://reader035.fdocuments.us/reader035/viewer/2022062423/56649d6a5503460f94a48910/html5/thumbnails/12.jpg)
Tuning Loops:Jamming
Combine two loopsfor (i=0; i<n; i++)
sum[i] = 0.0; for (i=0; i<n; i++) rate[i] = 0.03;
for (i=0; i<n; i++) { sum [i] = 0.0; rate[i] = 0.03; }
![Page 13: Code Tuning Techniques CPSC 315 – Programming Studio Spring 2008 Most examples from Code Complete 2.](https://reader035.fdocuments.us/reader035/viewer/2022062423/56649d6a5503460f94a48910/html5/thumbnails/13.jpg)
Tuning Loops:Unrolling
Do more work inside loop for fewer iterations Complete unroll: no more loop… Occasionally done by compilers (if recognizable)for (i=0; i<n; i++) { a[i] = i;}
for (i=0; i<(n-1); i+=2) { a[i] = i; a[i+1] = i+1;}if (i == n-1) a[n-1] = n-1;
![Page 14: Code Tuning Techniques CPSC 315 – Programming Studio Spring 2008 Most examples from Code Complete 2.](https://reader035.fdocuments.us/reader035/viewer/2022062423/56649d6a5503460f94a48910/html5/thumbnails/14.jpg)
Tuning Loops:Minimizing Interior Work
Move repeated computation outsidefor (i=0; i<n; i++) { balance[i] += purchase->allocator->indiv->borrower; amounttopay[i] = balance[i]*(prime+card)*pcentpay;}
newamt = purchase->allocator->indiv->borrower;payrate = (prime+card)*pcentpay;for (i=0; i<n; i++) { balance[i] += newamt; amounttopay[i] = balance[i]*payrate;}
![Page 15: Code Tuning Techniques CPSC 315 – Programming Studio Spring 2008 Most examples from Code Complete 2.](https://reader035.fdocuments.us/reader035/viewer/2022062423/56649d6a5503460f94a48910/html5/thumbnails/15.jpg)
Tuning Loops:Sentinel Values
Test value placed after end of array to guarantee terminationi=0;found = FALSE;while ((!found) && (i<n)) { if (a[i] == testval) found = TRUE; else i++;}if (found) … //Value found
savevalue = a[n];a[n] = testval;i=0;while (a[i] != testval) i++;if (i<n) … // Value found
![Page 16: Code Tuning Techniques CPSC 315 – Programming Studio Spring 2008 Most examples from Code Complete 2.](https://reader035.fdocuments.us/reader035/viewer/2022062423/56649d6a5503460f94a48910/html5/thumbnails/16.jpg)
Tuning Loops:Busiest Loop on Inside
Reduce overhead by calling fewer loopsfor (i=0; i<100; i++) // 100 for (j=0; j<10; j++) // 1000 dosomething(i,j);1100 loop iterations
for (j=0; j<10; j++) // 10 for (i=0; i<100; i++) // 1000 dosomething(i,j);1010 loop iterations
![Page 17: Code Tuning Techniques CPSC 315 – Programming Studio Spring 2008 Most examples from Code Complete 2.](https://reader035.fdocuments.us/reader035/viewer/2022062423/56649d6a5503460f94a48910/html5/thumbnails/17.jpg)
Tuning Loops:Strength Reduction
Replace multiplication involving loop index by addition
for (i=0; i<n; i++)
a[i] = i*conversion;
sum = 0; // or: a[0] = 0;
for (i=0; i<n; i++) { // or: for (i=1; i<n; i++)
a[i] = sum; // or: a[i] =
sum += conversion; // a[i-1]+conversion;
}
![Page 18: Code Tuning Techniques CPSC 315 – Programming Studio Spring 2008 Most examples from Code Complete 2.](https://reader035.fdocuments.us/reader035/viewer/2022062423/56649d6a5503460f94a48910/html5/thumbnails/18.jpg)
Transforming Data:Integers Instead of Floats
Integer math tends to be faster than floating point
Use ints instead of floats where appropriate
Likewise, use floats instead of doubles
Need to test on system…
![Page 19: Code Tuning Techniques CPSC 315 – Programming Studio Spring 2008 Most examples from Code Complete 2.](https://reader035.fdocuments.us/reader035/viewer/2022062423/56649d6a5503460f94a48910/html5/thumbnails/19.jpg)
Transforming Data:Fewer Array Dimensions
Express as 1D arrays instead of 2D/3D as appropriate Beware assumptions on memory organization
for (i=0; i<rows; i++) for (j=0; j<cols; j++) a[i][j] = 0.0;
for (i=0; i<rows*cols; i++) a[i] = 0.0;
![Page 20: Code Tuning Techniques CPSC 315 – Programming Studio Spring 2008 Most examples from Code Complete 2.](https://reader035.fdocuments.us/reader035/viewer/2022062423/56649d6a5503460f94a48910/html5/thumbnails/20.jpg)
Transforming Data:Minimize Array Refs
Avoid repeated array references Like minimizing interior work
for (i=0; i<r; i++) for (j=0; j<c; j++) a[j] = b[j] + c[i];
for (i=0; i<r; i++) { temp = c[i]; for (j=0; j<c; j++) a[j] = b[j] + temp;}
![Page 21: Code Tuning Techniques CPSC 315 – Programming Studio Spring 2008 Most examples from Code Complete 2.](https://reader035.fdocuments.us/reader035/viewer/2022062423/56649d6a5503460f94a48910/html5/thumbnails/21.jpg)
Transforming Data:Use Supplementary Indexes
Sort indices in array rather than elements themselvesTradeoff extra dereference in place of
copies
![Page 22: Code Tuning Techniques CPSC 315 – Programming Studio Spring 2008 Most examples from Code Complete 2.](https://reader035.fdocuments.us/reader035/viewer/2022062423/56649d6a5503460f94a48910/html5/thumbnails/22.jpg)
Transforming Data:Use Caching
Store data instead of (re-)computinge.g. store length of an array (ended by
sentinel) once computede.g. repeated computation in loop
Overhead in storing data is offset byMore accesses to same computationExpense of initial computation
![Page 23: Code Tuning Techniques CPSC 315 – Programming Studio Spring 2008 Most examples from Code Complete 2.](https://reader035.fdocuments.us/reader035/viewer/2022062423/56649d6a5503460f94a48910/html5/thumbnails/23.jpg)
Tuning Expressions:Algebraic Identities and Strength
ReductionAvoid excessive computation sqrt(x) < sqrt(y) equivalent to x < y
Combine logical expressions !a || !b equivalent to !(a && b)
Use trigonometric/other identitiesRight/Left shift to multiply/divide by 2e.g. Efficient polynomial evaluation A*x*x*x + B*x*x + C*x + D = (((A*x)+B)*x)+C)*x+D
![Page 24: Code Tuning Techniques CPSC 315 – Programming Studio Spring 2008 Most examples from Code Complete 2.](https://reader035.fdocuments.us/reader035/viewer/2022062423/56649d6a5503460f94a48910/html5/thumbnails/24.jpg)
Tuning Expressions:Compile-Time Initialization
Known constant passed to function can be replaced by value.
log2val = log(val) / log(2);
const double LOG2 = 0.69314718;
log2val = log(val) / LOG2;
![Page 25: Code Tuning Techniques CPSC 315 – Programming Studio Spring 2008 Most examples from Code Complete 2.](https://reader035.fdocuments.us/reader035/viewer/2022062423/56649d6a5503460f94a48910/html5/thumbnails/25.jpg)
Tuning Expressions:Avoid System Calls
Avoid calls that provide more computation than needede.g. if you need an integer log, don’t
compute floating point logarithmCould count # of shifts neededCould program an if-then statement to identify
the log (only a few cases)
![Page 26: Code Tuning Techniques CPSC 315 – Programming Studio Spring 2008 Most examples from Code Complete 2.](https://reader035.fdocuments.us/reader035/viewer/2022062423/56649d6a5503460f94a48910/html5/thumbnails/26.jpg)
Tuning Expressions:Use Correct Types
Avoid unnecessary type conversions
Use floating-point constants for floats, integer constants for ints
![Page 27: Code Tuning Techniques CPSC 315 – Programming Studio Spring 2008 Most examples from Code Complete 2.](https://reader035.fdocuments.us/reader035/viewer/2022062423/56649d6a5503460f94a48910/html5/thumbnails/27.jpg)
Tuning Expressions:Precompute Results
Storing data in tables/constants instead of computing at run-timeEven large precomputation can be tolerated for good run-timeExamplesStore table in fileConstants in codeCaching
![Page 28: Code Tuning Techniques CPSC 315 – Programming Studio Spring 2008 Most examples from Code Complete 2.](https://reader035.fdocuments.us/reader035/viewer/2022062423/56649d6a5503460f94a48910/html5/thumbnails/28.jpg)
Tuning Expressions:Eliminate Common
SubexpressionsAnything repeated several times can be computed once (“factored” out) insteadCompilers pretty good at recognizing, now
a = b + (c/d) - e*(c/d) + f*(d/c);
t = c/d;a = b + t - e*t + f/t;
![Page 29: Code Tuning Techniques CPSC 315 – Programming Studio Spring 2008 Most examples from Code Complete 2.](https://reader035.fdocuments.us/reader035/viewer/2022062423/56649d6a5503460f94a48910/html5/thumbnails/29.jpg)
Other Tuning:Inlining Routines
Avoiding function call overhead by putting function code in place of function callAlso called Macros
Some languages support directly (C++: inline)Compilers tend to minimize overhead already, anyway
![Page 30: Code Tuning Techniques CPSC 315 – Programming Studio Spring 2008 Most examples from Code Complete 2.](https://reader035.fdocuments.us/reader035/viewer/2022062423/56649d6a5503460f94a48910/html5/thumbnails/30.jpg)
Other Tuning:Recoding in Low-Level Language
Rewrite sections of code in lower-level (and probably much more efficient) language
Lower-level language depends on starting level Python -> C++ C++ -> assembler
Should only be done at bottlenecks
Increase can vary greatly
![Page 31: Code Tuning Techniques CPSC 315 – Programming Studio Spring 2008 Most examples from Code Complete 2.](https://reader035.fdocuments.us/reader035/viewer/2022062423/56649d6a5503460f94a48910/html5/thumbnails/31.jpg)
Other Tuning:Buffer I/O
Buffer input and outputAllows more data to be processed at onceUsually overhead in sending output, getting
input
![Page 32: Code Tuning Techniques CPSC 315 – Programming Studio Spring 2008 Most examples from Code Complete 2.](https://reader035.fdocuments.us/reader035/viewer/2022062423/56649d6a5503460f94a48910/html5/thumbnails/32.jpg)
Other Tuning:Handle Special Cases
SeparatelyAfter writing general purpose code, identify hot spotsWrite special-case code to handle those
cases more efficiently
Avoid overly complicated code to handle all casesClassify into cases/groups, and separate
code for each
![Page 33: Code Tuning Techniques CPSC 315 – Programming Studio Spring 2008 Most examples from Code Complete 2.](https://reader035.fdocuments.us/reader035/viewer/2022062423/56649d6a5503460f94a48910/html5/thumbnails/33.jpg)
Other Tuning:Use Approximate Values
Sometimes can get away with approximate values
Use simpler computation if it is “close enough”e.g. integer sin/cos, truncate small values
to 0.
![Page 34: Code Tuning Techniques CPSC 315 – Programming Studio Spring 2008 Most examples from Code Complete 2.](https://reader035.fdocuments.us/reader035/viewer/2022062423/56649d6a5503460f94a48910/html5/thumbnails/34.jpg)
Other Tuning:Recompute to Save SpaceOpposite of Caching!
If memory access is an issue, try not to store extra data
Recompute values to avoid additional memory accesses, even if already stored somewhere