File: profiler.rst

package info (click to toggle)
flint 3.4.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 68,996 kB
  • sloc: ansic: 915,350; asm: 14,605; python: 5,340; sh: 4,512; lisp: 2,621; makefile: 787; cpp: 341
file content (139 lines) | stat: -rw-r--r-- 4,600 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
.. _profiler:

**profiler.h** -- performance profiling
===============================================================================

Most of this module is only usable on certain platforms, while ``timeit``
functions is available on all platforms.  The only platforms that can access
the whole module is x86-64 and ARM64 on Unix type systems.

Timer based on clock
--------------------------------------------------------------------------------

.. function:: void timeit_start(timeit_t t)
              void timeit_stop(timeit_t t)
              void timeit_print(timeit_t t, ulong reps)

    Gives wall and user time - useful for parallel programming.

    Example usage::

        timeit_t t0;
        timeit_start(t0);
        // do stuff, take some time
        timeit_stop(t0);
        timeit_print(t0, 1); // only one repetition was done

.. macro:: TIMEIT_REPEAT(timer, reps)
           TIMEIT_END_REPEAT(timer, reps)

    Repeatedly runs the code between the ``TIMEIT_REPEAT`` and the
    ``TIMEIT_END_REPEAT`` markers, automatically increasing the number of
    repetitions until the elapsed time exceeds the timer resolution. The macro
    takes as input a predefined ``timeit_t`` object and an integer variable to
    hold the number of repetitions.

.. macro:: TIMEIT_START
           TIMEIT_STOP

    Repeatedly runs the code between the ``TIMEIT_START`` and the
    ``TIMEIT_STOP`` markers, automatically increasing the number of repetitions
    until the elapsed time exceeds the timer resolution, and then prints the
    average elapsed cpu and wall time for a single repetition.

.. macro:: TIMEIT_ONCE_START
           TIMEIT_ONCE_STOP

    Runs the code between the ``TIMEIT_ONCE_START`` and the
    ``TIMEIT_ONCE_STOP`` markers exactly once and then prints the elapsed cpu
    and wall time. This does not give a precise measurement if the elapsed time
    is short compared to the timer resolution.


Timer based on cycle counter
--------------------------------------------------------------------------------

.. function:: void init_clock(int n)
              void init_all_clocks(void)
              void start_clock(int n)
              void stop_clock(int n)
              double get_clock(int n)

    Gives time based on cycle counter.

    First one must ensure the processor speed in cycles per second is set
    correctly in ``profiler.h``, in the macro definition ``#define
    FLINT_CLOCKSPEED``.

    One can access the cycle counter directly by :func:`get_cycle_counter`
    which returns the current cycle counter as a ``double``.

    A sample usage of clocks is::

        init_all_clocks();
        start_clock(n);
        // do something
        stop_clock(n);
        flint_printf("Time in seconds is %f.3\n", get_clock(n));

    where ``n`` is a clock number (from 0-19 by default). The number of 
    clocks can be changed by altering ``FLINT_NUM_CLOCKS``. One can also 
    initialise an individual clock with ``init_clock(n)``.

.. function:: void prof_repeat(double * min, double * max, profile_target_t target, void * arg)

    Allows one to automatically time a given function. Here is a sample usage:

    Suppose one has a function one wishes to profile::

        void myfunc(ulong a, ulong b);

    One creates a struct for passing arguments to our function::

        typedef struct { ulong a, b; } myfunc_t;

    a sample function::

        void sample_myfunc(void * arg, ulong count)
        {
            myfunc_t * params = (myfunc_t *) arg;

            ulong a = params->a;
            ulong b = params->b;

            for (ulong i = 0; i < count; i++)
            {
                prof_start();
                myfunc(a, b);
                prof_stop();
            }
        }

    Then we do the profile::

        double min, max;

        myfunc_t params;

        params.a = 3;
        params.b = 4;

        prof_repeat(&min, &max, sample_myfunc, &params);
        
        flint_printf("Min time is %lf.3s, max time is %lf.3s\n", min, max);

    If either of the first two parameters to ``prof_repeat`` is 
    ``NULL``, that value is not stored.

    One may set the minimum time in microseconds for a timing run by 
    adjusting ``DURATION_THRESHOLD`` and one may set a target duration 
    in microseconds by adjusting ``DURATION_TARGET`` in ``profiler.h``.


Memory usage
--------------------------------------------------------------------------------

.. function:: void fprint_memory_usage(FILE * fs)
              void print_memory_usage(void)

    Obtains information about the memory usage of the current process.