[ Reference Manual | Alphabetic Index ]

# library(port_profiler)

Port Counting Profiler [more]

## Predicates

> last_port_profile(++Options)
>   Output another port profile for the most recently profiled goal
> port_profile(?)
>   No description available
> port_profile(+Goal, ++Options)
>   Create a (box model) port profile for the given Goal execution

## Description

This is a performance analysis tool based on counting of events during program execution. The events that are counted are defined in terms of the 'box model' of execution (the same model that the debugger uses). In this box model, predicates are entered though call, redo or resume ports, and exited through exit, fail or leave ports. In addition, other interesting events are indicated by ports as well (next, else, delay).

The usage is as follows:

1. Compile your program in debug mode, as you would normally do during program development, e.g.

           	?- compile(queen).

2. Load the port_profiler library

           	?- lib(port_profiler).

3. Run the query which you want to examine, using port_profile/2:

           	?- port_profile(queen([1,2,3,4],Out), []).

   This will print the results in a table.

The default output you get looks like this:

    	PREDICATE       CALLER               call     exit     fail    *exit     redo
    	store_set   /3  nodiag      /3        106      106        .        .        .
    	-           /3  nodiag      /3         46       46        .        .        .
    	=\=         /2  nodiag      /3         46       45        1        .        .
    	qperm       /2  qperm       /2         30       28        .       16       14
    	qdelete     /4  qperm       /2         20       18        .       12       10
    	nodiag      /3  nodiag      /3         17       14        3        .        .
    	nodiag      /3  safe        /1         17        7       10        .        .
    	+           /3  nodiag      /3         17       17        .        .        .
    	qdelete     /4  qdelete     /4         10        9        .        3        2
    	qperm       /2  queen       /2          1        .        .       11       10
    	safe        /1  queen       /2         11        1       10        .        .
    	safe        /1  safe        /1          7        4        3        .        .
    	queen       /2  trace_body  /2          1        .        .        1        .

The port counts give information about

- what are the most frequently called predicates (call ports)
- whether predicates failed unexpectedly (fail ports)
- whether predicates exited nondeterministically (*exit ports), i.e. whether they left behind any choice-points for backtracking.
- whether nondeterministically exited predicates were ever re-entered to find alternative solutions (redo ports).
- whether predicates did internal backtracking (next ports) in order to find the right clause. This may indicate suboptimal indexing.
- how often predicates were delayed and resumed.

By default, statistics are collected separately for each predicate-caller pair, i.e. multiple lines appear for a predicate when it is called from different caller predicates. This feature can be disabled so that predicates are not distingushed by their caller. It is also possible to restrict data collection to predicates with a spy point only (less time consuming).

Other options allow output in different formats, e.g. as an html file, with a subset or different order of the ports, or with module information. For details, see the description of port_profile/2.

Related, but different tools are:

- The sampling profiler (profile/1,2 from lib(profile)): this works even on optimized, non-traceable code and gives timing information. It does not give information about the caller predicate.
- The coverage analyzer (see lib(coverage)): this is also based on counting, but has counters for every program point and is probably less useful for performance analysis.

## About

- Author: Joachim Schimpf, IC-Parc
- Copyright © Cisco Systems, Inc
- Date: $Date: 2012/02/06 13:24:43 $

Generated from port_profiler.eci on 2020-02-26 22:26