blob: ed3b04787087af037006c4988180789f668152ca
1 | /* |
2 | * copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at> |
3 | * |
4 | * This file is part of FFmpeg. |
5 | * |
6 | * FFmpeg is free software; you can redistribute it and/or |
7 | * modify it under the terms of the GNU Lesser General Public |
8 | * License as published by the Free Software Foundation; either |
9 | * version 2.1 of the License, or (at your option) any later version. |
10 | * |
11 | * FFmpeg is distributed in the hope that it will be useful, |
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
14 | * Lesser General Public License for more details. |
15 | * |
16 | * You should have received a copy of the GNU Lesser General Public |
17 | * License along with FFmpeg; if not, write to the Free Software |
18 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
19 | */ |
20 | |
21 | /** |
22 | * @file |
23 | * high precision timer, useful to profile code |
24 | */ |
25 | |
26 | #ifndef AVUTIL_TIMER_H |
27 | #define AVUTIL_TIMER_H |
28 | |
29 | #include <stdlib.h> |
30 | #include <stdint.h> |
31 | #include <inttypes.h> |
32 | |
33 | #include "config.h" |
34 | |
35 | #if HAVE_MACH_MACH_TIME_H |
36 | #include <mach/mach_time.h> |
37 | #endif |
38 | |
39 | #include "log.h" |
40 | |
41 | #if ARCH_AARCH64 |
42 | # include "aarch64/timer.h" |
43 | #elif ARCH_ARM |
44 | # include "arm/timer.h" |
45 | #elif ARCH_PPC |
46 | # include "ppc/timer.h" |
47 | #elif ARCH_X86 |
48 | # include "x86/timer.h" |
49 | #endif |
50 | |
51 | #if !defined(AV_READ_TIME) |
52 | # if HAVE_GETHRTIME |
53 | # define AV_READ_TIME gethrtime |
54 | # elif HAVE_MACH_ABSOLUTE_TIME |
55 | # define AV_READ_TIME mach_absolute_time |
56 | # endif |
57 | #endif |
58 | |
59 | #ifndef FF_TIMER_UNITS |
60 | # define FF_TIMER_UNITS "UNITS" |
61 | #endif |
62 | |
63 | #ifdef AV_READ_TIME |
64 | #define START_TIMER \ |
65 | uint64_t tend; \ |
66 | uint64_t tstart = AV_READ_TIME(); \ |
67 | |
68 | #define STOP_TIMER(id) \ |
69 | tend = AV_READ_TIME(); \ |
70 | { \ |
71 | static uint64_t tsum = 0; \ |
72 | static int tcount = 0; \ |
73 | static int tskip_count = 0; \ |
74 | static int thistogram[32] = {0}; \ |
75 | thistogram[av_log2(tend - tstart)]++; \ |
76 | if (tcount < 2 || \ |
77 | tend - tstart < 8 * tsum / tcount || \ |
78 | tend - tstart < 2000) { \ |
79 | tsum+= tend - tstart; \ |
80 | tcount++; \ |
81 | } else \ |
82 | tskip_count++; \ |
83 | if (((tcount + tskip_count) & (tcount + tskip_count - 1)) == 0) { \ |
84 | int i; \ |
85 | av_log(NULL, AV_LOG_ERROR, \ |
86 | "%7"PRIu64" " FF_TIMER_UNITS " in %s,%8d runs,%7d skips", \ |
87 | tsum * 10 / tcount, id, tcount, tskip_count); \ |
88 | for (i = 0; i < 32; i++) \ |
89 | av_log(NULL, AV_LOG_VERBOSE, " %2d", av_log2(2*thistogram[i]));\ |
90 | av_log(NULL, AV_LOG_ERROR, "\n"); \ |
91 | } \ |
92 | } |
93 | #else |
94 | #define START_TIMER |
95 | #define STOP_TIMER(id) { } |
96 | #endif |
97 | |
98 | #endif /* AVUTIL_TIMER_H */ |
99 |