]>
Commit | Line | Data |
---|---|---|
d4697bc9 | 1 | # Copyright (C) 2013-2014 Free Software Foundation, Inc. |
8cfdb7e0 SP |
2 | # This file is part of the GNU C Library. |
3 | ||
4 | # The GNU C Library is free software; you can redistribute it and/or | |
5 | # modify it under the terms of the GNU Lesser General Public | |
6 | # License as published by the Free Software Foundation; either | |
7 | # version 2.1 of the License, or (at your option) any later version. | |
8 | ||
9 | # The GNU C Library is distributed in the hope that it will be useful, | |
10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
12 | # Lesser General Public License for more details. | |
13 | ||
14 | # You should have received a copy of the GNU Lesser General Public | |
15 | # License along with the GNU C Library; if not, see | |
16 | # <http://www.gnu.org/licenses/>. | |
17 | ||
18 | ||
19 | # Makefile for benchmark tests. The only useful target here is `bench`. | |
3ce9e010 | 20 | # Add benchmark functions in alphabetical order. |
8cfdb7e0 | 21 | |
8cfdb7e0 | 22 | subdir := benchtests |
a5f891ac JM |
23 | |
24 | include ../Makeconfig | |
bb9c256f SP |
25 | bench-math := acos acosh asin asinh atan atanh cos cosh exp exp2 ffs ffsll \ |
26 | log log2 modf pow rint sin sincos sinh sqrt tan tanh | |
27 | ||
28 | bench-pthread := pthread_once | |
29 | ||
30 | bench := $(bench-math) $(bench-pthread) | |
3ce9e010 | 31 | |
c1f75dc3 | 32 | # String function benchmarks. |
bbf6e8e4 WN |
33 | string-bench := bcopy bzero memccpy memchr memcmp memcpy memmem memmove \ |
34 | mempcpy memset rawmemchr stpcpy stpncpy strcasecmp strcasestr \ | |
35 | strcat strchr strchrnul strcmp strcpy strcspn strlen \ | |
36 | strncasecmp strncat strncmp strncpy strnlen strpbrk strrchr \ | |
9f6e964c | 37 | strspn strstr strcpy_chk stpcpy_chk memrchr strsep strtok |
826fa855 | 38 | string-bench-all := $(string-bench) |
c1f75dc3 | 39 | |
450a2e2d AZ |
40 | stdlib-bench := strtod |
41 | ||
42 | benchset := $(string-bench-all) $(stdlib-bench) | |
c1f75dc3 | 43 | |
f6c55796 WN |
44 | CFLAGS-bench-ffs.c += -fno-builtin |
45 | CFLAGS-bench-ffsll.c += -fno-builtin | |
46 | ||
79520f4b JM |
47 | $(addprefix $(objpfx)bench-,$(bench-math)): $(libm) |
48 | $(addprefix $(objpfx)bench-,$(bench-pthread)): $(shared-thread-library) | |
7849ff93 | 49 | |
8fc1bee5 SP |
50 | \f |
51 | ||
52 | # Rules to build and execute the benchmarks. Do not put any benchmark | |
53 | # parameters beyond this point. | |
54 | ||
c1f75dc3 SP |
55 | # We don't want the benchmark programs to run in parallel since that could |
56 | # affect their performance. | |
57 | .NOTPARALLEL: | |
58 | ||
8cfdb7e0 | 59 | include ../Rules |
8fc1bee5 SP |
60 | |
61 | binaries-bench := $(addprefix $(objpfx)bench-,$(bench)) | |
c1f75dc3 | 62 | binaries-benchset := $(addprefix $(objpfx)bench-,$(benchset)) |
8fc1bee5 | 63 | |
d569c6ee SP |
64 | # The default duration: 10 seconds. |
65 | ifndef BENCH_DURATION | |
66 | BENCH_DURATION := 10 | |
67 | endif | |
68 | ||
50b818bf | 69 | CPPFLAGS-nonlib += -DDURATION=$(BENCH_DURATION) |
d569c6ee | 70 | |
43fe811b SP |
71 | # Use clock_gettime to measure performance of functions. The default is to use |
72 | # HP_TIMING if it is available. | |
73 | ifdef USE_CLOCK_GETTIME | |
74 | CPPFLAGS-nonlib += -DUSE_CLOCK_GETTIME | |
75 | endif | |
76 | ||
56737508 SP |
77 | DETAILED_OPT := |
78 | ||
79 | ifdef DETAILED | |
80 | DETAILED_OPT := -d | |
81 | endif | |
82 | ||
4856bcd2 SP |
83 | # This makes sure CPPFLAGS-nonlib and CFLAGS-nonlib are passed |
84 | # for all these modules. | |
c1f75dc3 | 85 | cpp-srcs-left := $(binaries-benchset:=.c) $(binaries-bench:=.c) |
4856bcd2 SP |
86 | lib := nonlib |
87 | include $(patsubst %,$(..)cppflags-iterator.mk,$(cpp-srcs-left)) | |
88 | ||
970c602a WN |
89 | extra-objs += json-lib.o |
90 | ||
43fe811b | 91 | bench-deps := bench-skeleton.c bench-timing.h Makefile |
acb4325f | 92 | |
8fc1bee5 | 93 | run-bench = $(test-wrapper-env) \ |
8540f6d2 | 94 | $(run-program-env) \ |
8fc1bee5 SP |
95 | $($*-ENV) $(rtld-prefix) $${run} |
96 | ||
cb5e4aad SP |
97 | timing-type := $(objpfx)bench-timing-type |
98 | ||
a2964074 SP |
99 | bench-clean: |
100 | rm -f $(binaries-bench) $(addsuffix .o,$(binaries-bench)) | |
c1f75dc3 | 101 | rm -f $(binaries-benchset) $(addsuffix .o,$(binaries-benchset)) |
cb5e4aad | 102 | rm -f $(timing-type) $(addsuffix .o,$(timing-type)) |
c1f75dc3 | 103 | |
cb5e4aad | 104 | bench: $(timing-type) bench-set bench-func |
c1f75dc3 SP |
105 | |
106 | bench-set: $(binaries-benchset) | |
107 | for run in $^; do \ | |
108 | echo "Running $${run}"; \ | |
109 | $(run-bench) > $${run}.out; \ | |
110 | done | |
a2964074 | 111 | |
cb5e4aad SP |
112 | # Build and execute the benchmark functions. This target generates JSON |
113 | # formatted bench.out. Each of the programs produce independent JSON output, | |
114 | # so one could even execute them individually and process it using any JSON | |
115 | # capable language or tool. | |
c1f75dc3 | 116 | bench-func: $(binaries-bench) |
970c602a WN |
117 | { timing_type=$$($(timing-type)); \ |
118 | echo "{\"timing_type\": \"$${timing_type}\","; \ | |
119 | echo " \"functions\": {"; \ | |
cb5e4aad SP |
120 | for run in $^; do \ |
121 | if ! [ "x$${run}" = "x$<" ]; then \ | |
122 | echo ","; \ | |
123 | fi; \ | |
206a6699 | 124 | echo "Running $${run}" >&2; \ |
56737508 | 125 | $(run-bench) $(DETAILED_OPT); \ |
cb5e4aad | 126 | done; \ |
970c602a WN |
127 | echo; \ |
128 | echo " }"; \ | |
cb5e4aad | 129 | echo "}"; } > $(objpfx)bench.out-tmp; \ |
8fc1bee5 SP |
130 | if [ -f $(objpfx)bench.out ]; then \ |
131 | mv -f $(objpfx)bench.out $(objpfx)bench.out.old; \ | |
132 | fi; \ | |
133 | mv -f $(objpfx)bench.out-tmp $(objpfx)bench.out | |
134 | ||
970c602a | 135 | $(timing-type) $(binaries-bench) $(binaries-benchset): %: %.o $(objpfx)json-lib.o \ |
8fc1bee5 SP |
136 | $(sort $(filter $(common-objpfx)lib%,$(link-libc))) \ |
137 | $(addprefix $(csu-objpfx),start.o) $(+preinit) $(+postinit) | |
138 | $(+link) | |
139 | ||
acb4325f | 140 | $(objpfx)bench-%.c: %-inputs $(bench-deps) |
8fc1bee5 SP |
141 | { if [ -n "$($*-INCLUDE)" ]; then \ |
142 | cat $($*-INCLUDE); \ | |
143 | fi; \ | |
27c673b8 | 144 | $(.)scripts/bench.py $(patsubst %-inputs,%,$<); } > $@-tmp |
8fc1bee5 | 145 | mv -f $@-tmp $@ |