Profiling 26-Jul-16

advertisement
Profiling
26-Jul-16
Optimization


Optimization is the process of making a program as fast (or as
small) as possible
Here’s what the experts say about optimization:





Sir Tony Hoare: “Premature optimization is the root of all evil.”
Donald Knuth: “We should forget about small efficiencies, say about
97% of the time: premature optimization is the root of all evil.”
W. A. Wulf: “More computing sins are committed in the name of
efficiency (without necessarily achieving it) than for any other single
reason - including blind stupidity.”
Michael A. Jackson:
“The First and Second Rules of Program Optimization:
1. Don’t do it.
2. (For experts only!) Don’t do it yet.”
Richard Carlson: “Don’t sweat the small stuff.”
When should you optimize?

Optimize when (and only when):




One of the major principles of the XP (Extreme Programming)
approach is: “Do the simplest thing that could possibly work.”



A program you have written is taking too long to run
A method you have written will be called millions or billions of times in a
highly graphics-intensive application
Your code is going into the kernel of an operating system
In other words, don’t use a faster method in preference to a simpler one
If it turns out to be too slow, you can fix it later
However: If efficiency is completely ignored in a large project, it
may be very difficult to fix it later

Individual methods can be improved, but if the overall design of the
project is inefficient, redesign can be prohibitively expensive
What should you optimize?


From Wikipedia: In engineering, bottleneck is a phenomenon
where the performance or capacity of an entire system is limited
by a single component
The 90/10 rule is: 90% of the runtime is taken up by 10% of the
code



How do you find the bottleneck?



That 10% is the bottleneck
This is where significant improvements can be made
Intuition is surprisingly inaccurate
A profiler is a program that measures which parts of your program are
taking the most time (or using the most memory)
Use a profiler before you waste your time optimizing the wrong
part of the program!
What shouldn’t you optimize?



Don’t sweat the small stuff
Virtually any modern compiler is better at optimization than you
are
Consider:
for (int i = 0; i < array.length; i++) {
int limit = 100;
if (array[i] > limit) array[i] = limit;
}
Would this be faster if you took the assignment to limit out of the
loop?


No! The compiler will do that anyway
In fact, there is a fair chance that doing so would slow your program
down!
How should you optimize?

The best way to speed up a bottleneck is to avoid doing
it altogether!

Example: In one case study I read about, one program added
debugging information to a dataset; the dataset was sent to a
second program, which stripped off the debugging
information before using the dataset


The second best way is to find a faster algorithm


Eliminating the debugging information doubled the speed of the
program
This what a course in “Analysis of Algorithms” is all about
Always remember, though, that in “real life” you
should use a profiler to find out what to optimize

The fastest sorting algorithm in the world won’t help you
very much if you’re sorting a 10-element array
Aside: Timing without a profiler


Here’s an easy way to time a section of code:
long t = System.currentTimeMillis();
// code to be timed goes here
t = System.currentTimeMillis() - t;
System.out.println(t + " milliseconds");
Basic use of the NetBeans Profiler

First, make sure the
project you want to
profile is NetBean’s
“Main Project”
Adding the profiler to the project


Next, choose Profile > Profile Main Project...
You will get the following message; just click OK
Profile execution speeds

1
Next, click CPU, then Part of application, then edit...
2
3
Select root methods

Select the
methods you
want to
profile, then
click OK
Run the program

Click the Run button
Look at the results


I’ve left out a couple of obvious steps
This is just a very basic introduction--you should
explore some of the options yourself
Problems with profiling

Profiling is not as useful for distributed code


For example, an application that runs on a server, accesses a database,
makes remote calls, does input/output, etc., is too distributed for profiling
to be much help
Environment “noise” can be a problem

Profiling is more meaningful in the absence of “alien” code, network
access, input/output, etc.


Try to isolate the code to be profiled from these factors
Many Java compilers interpret the code the first time through,
rather than compile it


Run the code being tested multiple times, rather than just once
Longer runs are better; ideally, your profiling run should take tens of
seconds, or a few minutes
The End
Download