Performance and Memory issues

advertisement
Cosc 5/4755
Algorithms
Size and efficiency
Why?
• On modern desktops and laptops,
– Memory size gets larger and larger
• 8 GBs is now common and 16GBs considered reasonable.
– Processor speeds of current systems, are considered to be
so fast, that many now don't see the point in algorithm
efficiency. About 76,383 MIPS for Intel I7
• Only the algorithms with "massive" about of data to process
• With phones
– Average memory: 128MB for most smart phones (for all
applications).
– ARM processor v7a is about 2,000 MIPS (Droid and palm
pre cpus) Reference: Pentium III did about 1,350 MIPS.
• Note Blackberry, Iphone uses the ARM v6, about 740 MIPS
Meaning?
• You must be much more careful about your
algorithms and memory management together.
– You need to really think about the big-O of your
algorithms and how much memory it takes.
– Think about the number of nested calls you make.
• Some really fast algorithms are recursive, but you maybe
using far more memory for every call.
• You may need to use a slower algorithm, because it's
memory needs are much less.
• Java helps a lot, because it uses call by reference by default
except primitive data types.
memory management tips
• A lot of object creation and destruction can lead to a
fragmented heap, which reduces the ability to create
further objects.
– Reuse your objects, when ever possible.
– Use as few objects as possible.
• Dispose of Objects; close the database, files, and the
network connections as soon as they are no longer needed.
• Use class destructors to ensure everything's is correctly
disposed.
– Dereference objects (set them to null) when they're no longer
useful so they will be garbage-collected.
• You can use System.gc() to jump-start or push the garbage
collection process. (but not recommended)
memory management tips (2)
• Use public variables in your classes, rather than
using accessors.
– This is technically bad programming practice, but it
saves bytecode space.
• Be extra careful to place things in memory only
when they are in use.
– For example, discard an introduction splash screen
after display.
• Try to reduce the number of classes used.
– Combine classes into one if they vary only slightly in
behavior. Every class adds size overheads.
Blackberry Devices
• From blackberry developer's blog
• Find that memory leak, Part 1 and Part 2
– http://supportforums.blackberry.com/t5/BlackBer
ry-Developer-s-Blog/How-to-find-that-memoryleak-Part-One/ba-p/367133
– http://supportforums.blackberry.com/t5/BlackBer
ry-Developer-s-Blog/How-To-Find-That-MemoryLeak-Part-Two-Detecting-The-Leak/ba-p/432660
performance tips.
• Whenever possible don’t draw off the screen
size
– Figure out the width and height (when possible)
– so that the system is not using clipping algorithms.
• Use Double buffering is possible by using an
offscreen image the size of the screen.
– Most blackberry and android double buffer by
default, but you should check.
Performance Tips (2)
• Minimize redundant arithmetic operations
• example: Rotating a point around a center
double radians = (Math.PI/180);
//where px1 and py1 are distance from a center point xc, yc
int nx1 = (int) (px1 * Math.cos(radians*angle) - py1 * Math.sin(radians*angle));
int ny1 = (int) (px1 * Math.sin(radians*angle) + py1 * Math.cos(radians*angle));
x1 = xc + nx1;
y1 = yc + ny1;
• better Performance method
double radians = Math.toRadians(angle);
x1 = xc + (int) (px1 * Math.cos(radians) - py1 * Math.sin(radians));
y1 = yc + (int) (px1 * Math.sin(radians) + py1 * Math.cos(radians));
//If rotating more then one point, then create a variable for Math.cos(radians) &
Math.sin(radians) and/or running this code often.
//Note also removed an unnecessary variables as well for memory.
Performance Tips (3)
• Minimize method/function calls wherever
possible.
– If you repeating call the same method, which
returns same the same information then
– store that information in a variable for use
• This, of course, is a trade off with memory
use, since you are using more memory for
variables.
Performance Tips (4)
• While you are allowed, DON’T create variables
in the loops
• For (int i=0; … bad Create all the variables at
the beginning of the method/function, then
reuse them.
– Remember minimize you memory use, maximize
your speed.
• Variable creation is slower and uses more memory,
then just reusing one.
Code Optimization
• The best hardware and compilers will never equal
the abilities of a human being who has mastered
the science of effective algorithm and coding
design.
• Don’t forget your big O measurements.
– Operation counting can enhance program
performance.
– With this method, you count the number of
instruction types executed in a loop then determine
the number of machine cycles for each instruction.
Code Optimization
• Loop fusion combines loops that use the
same data elements, possibly improving
cache performance. For example:
for (i = 0; i < N; i++)
C[i] = A[i] + B[i];
for (i = 0; i < N; i++)
D[i] = E[i] + C[i];
becomes
for (i = 0; i < N; i++)
{ C[i] = A[i] + B[i];
D[i] = E[i] + C[i]; }
Code Optimization
• Loop fission splits large loops into smaller
ones to reduce data dependencies and
resource conflicts.
• A loop fission technique known as loop
peeling removes the beginning and ending
loop statements. For example:
for (i = 1; i < N+1; i++)
{ if (i==1)
A[i] = 0;
else if (i == N)
A[i] = N;
else A[i] = A[i] + 8; }
becomes
A[1] =
for (i
A[i]
A[N] =
0;
= 2; i < N; i++)
= A[i] + 8;
N;
Code Optimization
• There are a number of rules of thumb for
getting the most out of program performance.
• Optimization efforts pay the biggest dividends
when they are applied to code segments that
are executed the most frequently.
• In short, try to make the common cases fast.
Conflicting info
• There is any number of conflicting
performance and memory info
– The big one is to inherit or not to inherit classes.
• Many say to collapse the inheritance tree as best as you
can for both memory use and performance
• Why others, say inheritance saves memory and
improves performance
– Answer?
User Interfaces tips
• Attempt to create applications that can
accomplish 80% or more of their operations
through the touch of a single key/button or the
"tap" or touch of the stylus to the screen.
• Trying to manipulate a very small scroll bar on a
small screen can be an exercise in hand-eye
coordination. Horizontal scrolling should be
avoided at all costs. Use "jump-to" buttons rather
than scrollbars.
• Try to avoid having the user remember any data,
or worse, having to compare data across screens.
References
• Java ME Performance Tuning
– http://www.javaperformancetuning.com/tips/j2m
e.shtml
• Many more web sites
– google search
• Java ME performance issues
• java ME memory issues or improving memory use
Q&A
Download