|
The Magma profiler records timing information for each function, procedure,
map, and intrinsic call made by your program. When the profiler is switched
on, upon the entry and exit to each such call the current system clock time
is recorded. This information is then stored in a call graph, which can be
viewed in various ways.
Turns profiling on (if b is true) or off (if b is false). Profiling
information is stored cumulatively, which means that in the middle of a
profiling run, the profiler can be switched off during sections for which
profiling information is not wanted. At startup, the profiler is off. Turning
the profiler on will slow down the execution of your program slightly.
Returns whether profiling is turned on.
Clear out all information currently recorded by the profiler. It is generally
a good idea to do this after the call graph has been obtained, so that future
profiling runs in the same Magma session begin with a clean slate.
Get the call graph based upon the information recorded up to this point by the
profiler. This function will return an error if the profiler has not yet been
turned on.
The call graph is a directed graph, with the nodes representing the functions
that were called during the program's execution. There is an edge in the call
graph from a function x to a function y if y was called during the
execution of x. Thus, recursive calls will result in cycles in the call
graph.
Each node in the graph has an associated label, which is a record with the
following fields:
- (i)
- Name: the name of the function
- (ii)
- Time: the total time spent in the function
- (iii)
- Count: the number of times the function was called
Each edge < x, y > in the graph also has an associated label,
which is a record with the following fields:
- (i)
- Time: the total time spent in function y when it was
called from function x
- (ii)
- Count: the total number of times function y was called
by function x
We illustrate the basic use of the profiler in the following example. The code
we test is a simple implementation of the Fibonacci sequence; this can be
replaced by any Magma code that needs to be profiled.
> function fibonacci(n)
> if n eq 1 or n eq 2 then
> return 1;
> else
> return fibonacci(n - 1) + fibonacci(n - 2);
> end if;
> end function;
>
> SetProfile(true);
> time assert fibonacci(27) eq Fibonacci(27);
Time: 10.940
> SetProfile(false);
> G := ProfileGraph();
> G;
Digraph
Vertex Neighbours
1 2 3 6 7 ;
2 2 3 4 5 ;
3 ;
4 ;
5 ;
6 ;
7 ;
> V := Vertices(G);
> Label(V!1);
rec<recformat<Name: Strings(), Time: RealField(), Count: IntegerRing()> |
Name := <main>,
Time := 10.93999999999999950262,
Count := 1
>
> Label(V!2);
rec<recformat<Name: Strings(), Time: RealField(), Count: IntegerRing()> |
Name := fibonacci,
Time := 10.93999999999999950262,
Count := 392835
>
> E := Edges(G);
> Label(E![1,2]);
rec<recformat<Time: RealField(), Count: IntegerRing()> |
Time := 10.93999999999999950262,
Count := 1
>
[Next][Prev] [Right] [Left] [Up] [Index] [Root]
|