Port Profiler

## 15.7 Port Profiler

The port profiler is a performance analysis tool based on the idea of 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, see chapter 14.1). In this box model, predicates are entered though call, redo or resume ports, and exited through exit, *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.
2. Load the port_profiler library
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 like the following:

    PREDICATE       CALLER               call     exit     fail    *exit     redo
    -           /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        .

Each row of the table shows the information for a particular predicate (by default split according to different caller predicates). The table is sorted according to entry port count (call+redo+resume). 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.

For more details about different options and output formats, see the Reference Manual.