How to interpret the output

The output is a simple tab-separated file, ppp_Result.txt, with one line per method.
The first line contains column headers. The following columns exists:
An identifier for the method. In the output, this is almost meaningless.
During loading, all instrumentable methods (i.e. those with real java code) are assigned an Id. This id is used internally as an index into the arrays holding the call count and execution time.
The class name for the method, in JVM-internal form. It contains the full path, separated by "/". A "$" in the class name indicates that it is an inner class.
The method name. Class and instance initializers are displayed as "<clinit>" and "<init>".
The method signature, in JVM-internal form. Useful to tell overloaded methods apart. As an example, "(Ljava/util/Enumeration;ILjava/lang/String;)V" designates a method with three arguments: Enumeration (Ljava/util/Enumeration;), integer (I) and String (Ljava/lang/String;), and result type void (V).
The number of calls to this method.
The time spent in this method. The time is given in milliseconds by default. With the nano and linuxSMPhack options, it is given in nanoseconds. This is elapsed time, unless the linuxSMPhack option is used. In that case, it should be CPU time.
In addition to checking for individual methods with high call count or time, you may want to check total values per package. Currently, you must use external tools like spreadsheets to compute these values. For example, i once stumbled across a persistence layer using up 60% of the total time.

The overall "top ten" packages wrt. called methods and time-consuming methods are written to a separate file ppp_Result_summary.txt. Depending on the curcumstances, you may want to exclude the "most frequently called" packages from profiling (to reduce overhead), or include only the most time-consuming.