FFmpeg
libavutil
timer.h
Go to the documentation of this file.
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 "config.h"
30
31
#if CONFIG_LINUX_PERF
32
# ifndef _GNU_SOURCE
33
# define _GNU_SOURCE
34
# endif
35
# include <unistd.h>
// read(3)
36
# include <sys/ioctl.h>
37
# include <asm/unistd.h>
38
# include <linux/perf_event.h>
39
#endif
40
41
#include <stdlib.h>
42
#include <stdint.h>
43
#include <inttypes.h>
44
45
#if CONFIG_MACOS_KPERF
46
#include "
macos_kperf.h
"
47
#endif
48
49
#if HAVE_MACH_ABSOLUTE_TIME
50
#include <mach/mach_time.h>
51
#elif HAVE_CLOCK_GETTIME
52
#include <
time.h
>
53
#endif
54
55
#include "
common.h
"
56
#include "
log.h
"
57
58
#if ARCH_AARCH64
59
# include "
aarch64/timer.h
"
60
#elif ARCH_ARM
61
# include "
arm/timer.h
"
62
#elif ARCH_PPC
63
# include "
ppc/timer.h
"
64
#elif ARCH_X86
65
# include "
x86/timer.h
"
66
#elif ARCH_LOONGARCH
67
# include "
loongarch/timer.h
"
68
#endif
69
70
#if !defined(AV_READ_TIME)
71
# if HAVE_GETHRTIME
72
# define AV_READ_TIME gethrtime
73
# elif HAVE_MACH_ABSOLUTE_TIME
74
# define AV_READ_TIME mach_absolute_time
75
# elif HAVE_CLOCK_GETTIME && defined(CLOCK_MONOTONIC)
76
static
inline
int64_t
ff_read_time(
void
)
77
{
78
struct
timespec ts;
79
clock_gettime(CLOCK_MONOTONIC, &ts);
80
return
ts.tv_sec * INT64_C(1000000000) + ts.tv_nsec;
81
}
82
# define AV_READ_TIME ff_read_time
83
# define FF_TIMER_UNITS "ns"
84
# endif
85
#endif
86
87
#ifndef FF_TIMER_UNITS
88
# define FF_TIMER_UNITS "UNITS"
89
#endif
90
91
#define TIMER_REPORT(id, tdiff) \
92
{ \
93
static uint64_t tsum = 0; \
94
static int tcount = 0; \
95
static int tskip_count = 0; \
96
static int thistogram[32] = {0}; \
97
thistogram[av_log2(tdiff)]++; \
98
if (tcount < 2 || \
99
(tdiff) < 8 * tsum / tcount || \
100
(tdiff) < 2000) { \
101
tsum += (tdiff); \
102
tcount++; \
103
} else \
104
tskip_count++; \
105
if (((tcount + tskip_count) & (tcount + tskip_count - 1)) == 0) { \
106
int i; \
107
av_log(NULL, AV_LOG_ERROR, \
108
"%7" PRIu64 " " FF_TIMER_UNITS " in %s,%8d runs,%7d skips",\
109
tsum * 10 / tcount, id, tcount, tskip_count); \
110
for (i = 0; i < 32; i++) \
111
av_log(NULL, AV_LOG_VERBOSE, " %2d", av_log2(2*thistogram[i]));\
112
av_log(NULL, AV_LOG_ERROR, "\n"); \
113
} \
114
}
115
116
#if CONFIG_LINUX_PERF
117
118
#define START_TIMER \
119
static int linux_perf_fd = -1; \
120
uint64_t tperf; \
121
if (linux_perf_fd == -1) { \
122
struct perf_event_attr attr = { \
123
.type = PERF_TYPE_HARDWARE, \
124
.size = sizeof(struct perf_event_attr), \
125
.config = PERF_COUNT_HW_CPU_CYCLES, \
126
.disabled = 1, \
127
.exclude_kernel = 1, \
128
.exclude_hv = 1, \
129
}; \
130
linux_perf_fd = syscall(__NR_perf_event_open, &attr, \
131
0, -1, -1, 0); \
132
} \
133
if (linux_perf_fd == -1) { \
134
av_log(NULL, AV_LOG_ERROR, "perf_event_open failed: %s\n", \
135
av_err2str(AVERROR(errno))); \
136
} else { \
137
ioctl(linux_perf_fd, PERF_EVENT_IOC_RESET, 0); \
138
ioctl(linux_perf_fd, PERF_EVENT_IOC_ENABLE, 0); \
139
}
140
141
#define STOP_TIMER(id) \
142
ioctl(linux_perf_fd, PERF_EVENT_IOC_DISABLE, 0); \
143
read(linux_perf_fd, &tperf, sizeof(tperf)); \
144
TIMER_REPORT(id, tperf)
145
146
#elif CONFIG_MACOS_KPERF
147
148
#define START_TIMER \
149
uint64_t tperf; \
150
ff_kperf_init(); \
151
tperf = ff_kperf_cycles();
152
153
#define STOP_TIMER(id) \
154
TIMER_REPORT(id, ff_kperf_cycles() - tperf);
155
156
#elif defined(AV_READ_TIME)
157
#define START_TIMER \
158
uint64_t tend; \
159
uint64_t tstart = AV_READ_TIME(); \
160
161
#define STOP_TIMER(id) \
162
tend = AV_READ_TIME(); \
163
TIMER_REPORT(id, tend - tstart)
164
#else
165
#define START_TIMER
166
#define STOP_TIMER(id) { }
167
#endif
168
169
#endif
/* AVUTIL_TIMER_H */
int64_t
long long int64_t
Definition:
coverity.c:34
timer.h
timer.h
macos_kperf.h
time.h
timer.h
log.h
common.h
timer.h
timer.h
Generated on Sun Nov 24 2024 19:22:40 for FFmpeg by
1.8.17