| xf.li | bdd93d5 | 2023-05-12 07:10:14 -0700 | [diff] [blame] | 1 | # Copyright (C) 2013-2016 Free Software Foundation, Inc. | 
 | 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 | # Makefile for benchmark tests.  The only useful target here is `bench`. | 
 | 19 | # Add benchmark functions in alphabetical order. | 
 | 20 |  | 
 | 21 | PYTHON := python | 
 | 22 |  | 
 | 23 | subdir := benchtests | 
 | 24 |  | 
 | 25 | include ../Makeconfig | 
 | 26 | bench-math := acos acosh asin asinh atan atanh cos cosh exp exp2 log log2 \ | 
 | 27 | 	      modf pow rint sin sincos sinh sqrt tan tanh | 
 | 28 |  | 
 | 29 | bench-pthread := pthread_once | 
 | 30 |  | 
 | 31 | bench-string := ffs ffsll | 
 | 32 |  | 
 | 33 | bench := $(bench-math) $(bench-pthread) $(bench-string) | 
 | 34 |  | 
 | 35 | # String function benchmarks. | 
 | 36 | string-benchset := bcopy bzero memccpy memchr memcmp memcpy memmem memmove \ | 
 | 37 | 		   mempcpy memset rawmemchr stpcpy stpncpy strcasecmp strcasestr \ | 
 | 38 | 		   strcat strchr strchrnul strcmp strcpy strcspn strlen \ | 
 | 39 | 		   strncasecmp strncat strncmp strncpy strnlen strpbrk strrchr \ | 
 | 40 | 		   strspn strstr strcpy_chk stpcpy_chk memrchr strsep strtok \ | 
 | 41 | 		   strcoll | 
 | 42 | wcsmbs-benchset := wcslen wcsnlen wcscpy wcpcpy wcsncpy wcpncpy wcscat wcsncat \ | 
 | 43 | 		   wcscmp wcsncmp wcschr wcschrnul wcsrchr wcsspn wcspbrk wcscspn \ | 
 | 44 | 		   wmemchr wmemset wmemcmp | 
 | 45 | string-benchset-all := $(string-benchset) ${wcsmbs-benchset} | 
 | 46 |  | 
 | 47 | # We have to generate locales | 
 | 48 | LOCALES := en_US.UTF-8 tr_TR.UTF-8 cs_CZ.UTF-8 fa_IR.UTF-8 fr_FR.UTF-8 \ | 
 | 49 | 	   ja_JP.UTF-8 si_LK.UTF-8 en_GB.UTF-8 vi_VN.UTF-8 ar_SA.UTF-8 \ | 
 | 50 | 	   da_DK.UTF-8 pl_PL.UTF-8 pt_PT.UTF-8 el_GR.UTF-8 ru_RU.UTF-8 \ | 
 | 51 | 	   iw_IL.UTF-8 is_IS.UTF-8 es_ES.UTF-8 hi_IN.UTF-8 sv_SE.UTF-8 \ | 
 | 52 | 	   hu_HU.UTF-8 it_IT.UTF-8 sr_RS.UTF-8 zh_CN.UTF-8 | 
 | 53 | include ../gen-locales.mk | 
 | 54 |  | 
 | 55 | stdlib-benchset := strtod | 
 | 56 |  | 
 | 57 | stdio-common-benchset := sprintf | 
 | 58 |  | 
 | 59 | math-benchset := math-inlines | 
 | 60 |  | 
 | 61 | benchset := $(string-benchset-all) $(stdlib-benchset) $(stdio-common-benchset) \ | 
 | 62 | 	    $(math-benchset) | 
 | 63 |  | 
 | 64 | CFLAGS-bench-ffs.c += -fno-builtin | 
 | 65 | CFLAGS-bench-ffsll.c += -fno-builtin | 
 | 66 |  | 
 | 67 | bench-malloc := malloc-thread | 
 | 68 |  | 
 | 69 | $(addprefix $(objpfx)bench-,$(bench-math)): $(libm) | 
 | 70 | $(addprefix $(objpfx)bench-,$(math-benchset)): $(libm) | 
 | 71 | $(addprefix $(objpfx)bench-,$(bench-pthread)): $(shared-thread-library) | 
 | 72 | $(objpfx)bench-malloc-thread: $(shared-thread-library) | 
 | 73 |  | 
 | 74 |  | 
 | 75 |  | 
 | 76 | # Rules to build and execute the benchmarks.  Do not put any benchmark | 
 | 77 | # parameters beyond this point. | 
 | 78 |  | 
 | 79 | # We don't want the benchmark programs to run in parallel since that could | 
 | 80 | # affect their performance. | 
 | 81 | .NOTPARALLEL: | 
 | 82 |  | 
 | 83 | include ../Rules | 
 | 84 |  | 
 | 85 | binaries-bench := $(addprefix $(objpfx)bench-,$(bench)) | 
 | 86 | binaries-benchset := $(addprefix $(objpfx)bench-,$(benchset)) | 
 | 87 | binaries-bench-malloc := $(addprefix $(objpfx)bench-,$(bench-malloc)) | 
 | 88 |  | 
 | 89 | # The default duration: 10 seconds. | 
 | 90 | ifndef BENCH_DURATION | 
 | 91 | BENCH_DURATION := 10 | 
 | 92 | endif | 
 | 93 |  | 
 | 94 | CPPFLAGS-nonlib += -DDURATION=$(BENCH_DURATION) | 
 | 95 |  | 
 | 96 | # Use clock_gettime to measure performance of functions.  The default is to use | 
 | 97 | # HP_TIMING if it is available. | 
 | 98 | ifdef USE_CLOCK_GETTIME | 
 | 99 | CPPFLAGS-nonlib += -DUSE_CLOCK_GETTIME | 
 | 100 | endif | 
 | 101 |  | 
 | 102 | DETAILED_OPT := | 
 | 103 |  | 
 | 104 | ifdef DETAILED | 
 | 105 | DETAILED_OPT := -d | 
 | 106 | endif | 
 | 107 |  | 
 | 108 | # This makes sure CPPFLAGS-nonlib and CFLAGS-nonlib are passed | 
 | 109 | # for all these modules. | 
 | 110 | cpp-srcs-left := $(binaries-benchset:=.c) $(binaries-bench:=.c) \ | 
 | 111 | 		 $(binaries-bench-malloc:=.c) | 
 | 112 | lib := nonlib | 
 | 113 | include $(patsubst %,$(..)cppflags-iterator.mk,$(cpp-srcs-left)) | 
 | 114 |  | 
 | 115 | extra-objs += json-lib.o | 
 | 116 |  | 
 | 117 | bench-deps := bench-skeleton.c bench-timing.h Makefile | 
 | 118 |  | 
 | 119 | run-bench = $(test-wrapper-env) \ | 
 | 120 | 	    $(run-program-env) \ | 
 | 121 | 	    $($*-ENV) $(rtld-prefix) $${run} | 
 | 122 |  | 
 | 123 | timing-type := $(objpfx)bench-timing-type | 
 | 124 |  | 
 | 125 | bench-clean: | 
 | 126 | 	rm -f $(binaries-bench) $(addsuffix .o,$(binaries-bench)) | 
 | 127 | 	rm -f $(binaries-benchset) $(addsuffix .o,$(binaries-benchset)) | 
 | 128 | 	rm -f $(binaries-bench-malloc) $(addsuffix .o,$(binaries-bench-malloc)) | 
 | 129 | 	rm -f $(timing-type) $(addsuffix .o,$(timing-type)) | 
 | 130 |  | 
 | 131 | bench: $(timing-type) $(gen-locales) bench-set bench-func bench-malloc | 
 | 132 |  | 
 | 133 | bench-set: $(binaries-benchset) | 
 | 134 | 	for run in $^; do \ | 
 | 135 | 	  echo "Running $${run}"; \ | 
 | 136 | 	  $(run-bench) > $${run}.out; \ | 
 | 137 | 	done | 
 | 138 |  | 
 | 139 | bench-malloc: $(binaries-bench-malloc) | 
 | 140 | 	run=$(objpfx)bench-malloc-thread; \ | 
 | 141 | 	for thr in 1 8 16 32; do \ | 
 | 142 | 	  echo "Running $${run} $${thr}"; \ | 
 | 143 | 	  $(run-bench) $${thr} > $${run}-$${thr}.out; \ | 
 | 144 | 	done | 
 | 145 |  | 
 | 146 | # Build and execute the benchmark functions.  This target generates JSON | 
 | 147 | # formatted bench.out.  Each of the programs produce independent JSON output, | 
 | 148 | # so one could even execute them individually and process it using any JSON | 
 | 149 | # capable language or tool. | 
 | 150 | bench-func: $(binaries-bench) | 
 | 151 | 	{ timing_type=$$($(timing-type)); \ | 
 | 152 | 	echo "{\"timing_type\": \"$${timing_type}\","; \ | 
 | 153 | 	echo " \"functions\": {"; \ | 
 | 154 | 	for run in $^; do \ | 
 | 155 | 	  if ! [ "x$${run}" = "x$<" ]; then \ | 
 | 156 | 	    echo ","; \ | 
 | 157 | 	  fi; \ | 
 | 158 | 	  echo "Running $${run}" >&2; \ | 
 | 159 | 	  $(run-bench) $(DETAILED_OPT); \ | 
 | 160 | 	done; \ | 
 | 161 | 	echo; \ | 
 | 162 | 	echo " }"; \ | 
 | 163 | 	echo "}"; } > $(objpfx)bench.out-tmp; \ | 
 | 164 | 	if [ -f $(objpfx)bench.out ]; then \ | 
 | 165 | 	  mv -f $(objpfx)bench.out $(objpfx)bench.out.old; \ | 
 | 166 | 	fi; \ | 
 | 167 | 	mv -f $(objpfx)bench.out-tmp $(objpfx)bench.out | 
 | 168 | 	$(PYTHON) scripts/validate_benchout.py $(objpfx)bench.out \ | 
 | 169 | 		scripts/benchout.schema.json | 
 | 170 |  | 
 | 171 | $(timing-type) $(binaries-bench) $(binaries-benchset) \ | 
 | 172 | 	$(binaries-bench-malloc): %: %.o $(objpfx)json-lib.o \ | 
 | 173 |   $(sort $(filter $(common-objpfx)lib%,$(link-libc))) \ | 
 | 174 |   $(addprefix $(csu-objpfx),start.o) $(+preinit) $(+postinit) | 
 | 175 | 	$(+link) | 
 | 176 |  | 
 | 177 | $(objpfx)bench-%.c: %-inputs $(bench-deps) | 
 | 178 | 	{ if [ -n "$($*-INCLUDE)" ]; then \ | 
 | 179 | 	  cat $($*-INCLUDE); \ | 
 | 180 | 	fi; \ | 
 | 181 | 	$(PYTHON) scripts/bench.py $(patsubst %-inputs,%,$<); } > $@-tmp | 
 | 182 | 	mv -f $@-tmp $@ |