PROFIL(2) System Calls PROFIL(2)

NAME


profil - execution time profile

SYNOPSIS


#include <unistd.h>

void profil(unsigned short *buff, unsigned int bufsiz, unsigned int offset,
unsigned int scale);


DESCRIPTION


The profil() function provides CPU-use statistics by profiling the
amount of CPU time expended by a program. The profil() function
generates the statistics by creating an execution histogram for a
current process. The histogram is defined for a specific region of
program code to be profiled, and the identified region is logically
broken up into a set of equal size subdivisions, each of which
corresponds to a count in the histogram. With each clock tick, the
current subdivision is identified and its corresponding histogram
count is incremented. These counts establish a relative measure of
how much time is being spent in each code subdivision. The resulting
histogram counts for a profiled region can be used to identify those
functions that consume a disproportionately high percentage of CPU
time.


The buff argument is a buffer of bufsiz bytes in which the histogram
counts are stored in an array of unsigned short int. Once one of the
counts reaches 32767 (the size of a short int), profiling stops and
no more data is collected.


The offset, scale, and bufsiz arguments specify the region to be
profiled.


The offset argument is effectively the start address of the region to
be profiled.


The scale argument is a contraction factor that indicates how much
smaller the histogram buffer is than the region to be profiled. More
precisely, scale is interpreted as an unsigned 16-bit fixed-point
fraction with the decimal point implied on the left. Its value is the
reciprocal of the number of bytes in a subdivision, per byte of
histogram buffer. Since there are two bytes per histogram counter,
the effective ratio of subdivision bytes per counter is one half the
scale.


The values of scale are as follows:

o the maximum value of scale, 0xffff (approximately 1),
maps subdivisions 2 bytes long to each counter.

o the minimum value of scale (for which profiling is
performed), 0x0002 (1/32,768), maps subdivision 65,536
bytes long to each counter.

o the default value of scale (currently used by cc -qp),
0x4000, maps subdivisions 8 bytes long to each counter.


The values are used within the kernel as follows: when the process
is interrupted for a clock tick, the value of offset is subtracted
from the current value of the program counter (pc), and the remainder
is multiplied by scale to derive a result. That result is used as an
index into the histogram array to locate the cell to be incremented.
Therefore, the cell count represents the number of times that the
process was executing code in the subdivision associated with that
cell when the process was interrupted.


The value of scale can be computed as (RATIO * 0200000L), where
RATIO is the desired ratio of bufsiz to profiled region size, and
has a value between 0 and 1. Qualitatively speaking, the closer RATIO
is to 1, the higher the resolution of the profile information.


The value of bufsiz can be computed as (size_of_region_to_be_profiled
* RATIO).


Profiling is turned off by giving a scale value of 0 or 1, and is
rendered ineffective by giving a bufsiz value of 0. Profiling is
turned off when one of the exec family of functions (see exec(2)) is
executed, but remains on in both child and parent processes after a
fork(2). Profiling is turned off if a buff update would cause a
memory fault.

USAGE


The pcsample(2) function should be used when profiling dynamically-
linked programs and 64-bit programs.

SEE ALSO


exec(2), fork(2), pcsample(2), times(2), monitor(3C), prof(7)

NOTES


In Solaris releases prior to 2.6, calling profil() in a multithreaded
program would impact only the calling LWP; the profile state was not
inherited at LWP creation time. To profile a multithreaded program
with a global profile buffer, each thread needed to issue a call to
profil() at threads start-up time, and each thread had to be a bound
thread. This was cumbersome and did not easily support dynamically
turning profiling on and off. In Solaris 2.6, the profil() system
call for multithreaded processes has global impact -- that is, a call
to profil() impacts all LWPs/threads in the process. This may cause
applications that depend on the previous per-LWP semantic to break,
but it is expected to improve multithreaded programs that wish to
turn profiling on and off dynamically at runtime.

November 12, 2001 PROFIL(2)

tribblix@gmail.com :: GitHub :: Privacy