2014-01-01 19:03:15 +08:00
|
|
|
|
# Copyright (C) 2013-2014 Free Software Foundation, Inc.
|
2013-03-15 15:00:03 +08:00
|
|
|
|
# This file is part of the GNU C Library.
|
|
|
|
|
|
|
|
|
|
# The GNU C Library is free software; you can redistribute it and/or
|
|
|
|
|
# modify it under the terms of the GNU Lesser General Public
|
|
|
|
|
# License as published by the Free Software Foundation; either
|
|
|
|
|
# version 2.1 of the License, or (at your option) any later version.
|
|
|
|
|
|
|
|
|
|
# The GNU C Library is distributed in the hope that it will be useful,
|
|
|
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
|
# Lesser General Public License for more details.
|
|
|
|
|
|
|
|
|
|
# You should have received a copy of the GNU Lesser General Public
|
|
|
|
|
# License along with the GNU C Library; if not, see
|
|
|
|
|
# <http://www.gnu.org/licenses/>.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Makefile for benchmark tests. The only useful target here is `bench`.
|
2013-05-22 13:35:04 +08:00
|
|
|
|
# Add benchmark functions in alphabetical order.
|
2013-03-15 15:00:03 +08:00
|
|
|
|
|
|
|
|
|
subdir := benchtests
|
2014-02-27 07:12:03 +08:00
|
|
|
|
|
|
|
|
|
include ../Makeconfig
|
2014-04-15 17:03:06 +08:00
|
|
|
|
bench-math := acos acosh asin asinh atan atanh cos cosh exp exp2 ffs ffsll \
|
|
|
|
|
log log2 modf pow rint sin sincos sinh sqrt tan tanh
|
|
|
|
|
|
|
|
|
|
bench-pthread := pthread_once
|
|
|
|
|
|
|
|
|
|
bench := $(bench-math) $(bench-pthread)
|
2013-05-22 13:35:04 +08:00
|
|
|
|
|
2013-04-16 20:07:24 +08:00
|
|
|
|
# String function benchmarks.
|
2013-09-04 16:11:58 +08:00
|
|
|
|
string-bench := bcopy bzero memccpy memchr memcmp memcpy memmem memmove \
|
|
|
|
|
mempcpy memset rawmemchr stpcpy stpncpy strcasecmp strcasestr \
|
|
|
|
|
strcat strchr strchrnul strcmp strcpy strcspn strlen \
|
|
|
|
|
strncasecmp strncat strncmp strncpy strnlen strpbrk strrchr \
|
2013-12-19 19:45:54 +08:00
|
|
|
|
strspn strstr strcpy_chk stpcpy_chk memrchr strsep strtok
|
2013-11-26 19:48:33 +08:00
|
|
|
|
string-bench-all := $(string-bench)
|
2013-04-16 20:07:24 +08:00
|
|
|
|
|
2013-11-11 21:23:02 +08:00
|
|
|
|
stdlib-bench := strtod
|
|
|
|
|
|
|
|
|
|
benchset := $(string-bench-all) $(stdlib-bench)
|
2013-04-16 20:07:24 +08:00
|
|
|
|
|
2014-03-31 22:58:19 +08:00
|
|
|
|
CFLAGS-bench-ffs.c += -fno-builtin
|
|
|
|
|
CFLAGS-bench-ffsll.c += -fno-builtin
|
|
|
|
|
|
2014-04-15 17:03:06 +08:00
|
|
|
|
$(addprefix $(objpfx)bench-,$(bench-math)): $(common-objpfx)math/libm.so
|
|
|
|
|
$(addprefix $(objpfx)bench-,$(bench-pthread)): \
|
|
|
|
|
$(common-objpfx)nptl/libpthread.so
|
2013-09-19 19:25:27 +08:00
|
|
|
|
|
2013-04-12 17:31:44 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Rules to build and execute the benchmarks. Do not put any benchmark
|
|
|
|
|
# parameters beyond this point.
|
|
|
|
|
|
2013-04-16 20:07:24 +08:00
|
|
|
|
# We don't want the benchmark programs to run in parallel since that could
|
|
|
|
|
# affect their performance.
|
|
|
|
|
.NOTPARALLEL:
|
|
|
|
|
|
2013-03-15 15:00:03 +08:00
|
|
|
|
include ../Rules
|
2013-04-12 17:31:44 +08:00
|
|
|
|
|
|
|
|
|
binaries-bench := $(addprefix $(objpfx)bench-,$(bench))
|
2013-04-16 20:07:24 +08:00
|
|
|
|
binaries-benchset := $(addprefix $(objpfx)bench-,$(benchset))
|
2013-04-12 17:31:44 +08:00
|
|
|
|
|
2013-04-30 16:40:20 +08:00
|
|
|
|
# The default duration: 10 seconds.
|
|
|
|
|
ifndef BENCH_DURATION
|
|
|
|
|
BENCH_DURATION := 10
|
|
|
|
|
endif
|
|
|
|
|
|
2013-06-10 12:38:46 +08:00
|
|
|
|
CPPFLAGS-nonlib += -DDURATION=$(BENCH_DURATION)
|
2013-04-30 16:40:20 +08:00
|
|
|
|
|
2013-05-13 16:14:32 +08:00
|
|
|
|
# Use clock_gettime to measure performance of functions. The default is to use
|
|
|
|
|
# HP_TIMING if it is available.
|
|
|
|
|
ifdef USE_CLOCK_GETTIME
|
|
|
|
|
CPPFLAGS-nonlib += -DUSE_CLOCK_GETTIME
|
|
|
|
|
endif
|
|
|
|
|
|
2014-03-29 12:10:19 +08:00
|
|
|
|
DETAILED_OPT :=
|
|
|
|
|
|
|
|
|
|
ifdef DETAILED
|
|
|
|
|
DETAILED_OPT := -d
|
|
|
|
|
endif
|
|
|
|
|
|
2013-04-16 21:04:03 +08:00
|
|
|
|
# This makes sure CPPFLAGS-nonlib and CFLAGS-nonlib are passed
|
|
|
|
|
# for all these modules.
|
2013-04-16 20:07:24 +08:00
|
|
|
|
cpp-srcs-left := $(binaries-benchset:=.c) $(binaries-bench:=.c)
|
2013-04-16 21:04:03 +08:00
|
|
|
|
lib := nonlib
|
|
|
|
|
include $(patsubst %,$(..)cppflags-iterator.mk,$(cpp-srcs-left))
|
|
|
|
|
|
2014-04-08 17:18:16 +08:00
|
|
|
|
extra-objs += json-lib.o
|
|
|
|
|
|
2013-05-13 16:14:32 +08:00
|
|
|
|
bench-deps := bench-skeleton.c bench-timing.h Makefile
|
2013-04-15 13:47:01 +08:00
|
|
|
|
|
2013-04-12 17:31:44 +08:00
|
|
|
|
run-bench = $(test-wrapper-env) \
|
|
|
|
|
GCONV_PATH=$(common-objpfx)iconvdata LC_ALL=C \
|
|
|
|
|
$($*-ENV) $(rtld-prefix) $${run}
|
|
|
|
|
|
2014-03-29 12:07:44 +08:00
|
|
|
|
timing-type := $(objpfx)bench-timing-type
|
|
|
|
|
|
2013-04-16 16:37:21 +08:00
|
|
|
|
bench-clean:
|
|
|
|
|
rm -f $(binaries-bench) $(addsuffix .o,$(binaries-bench))
|
2013-04-16 20:07:24 +08:00
|
|
|
|
rm -f $(binaries-benchset) $(addsuffix .o,$(binaries-benchset))
|
2014-03-29 12:07:44 +08:00
|
|
|
|
rm -f $(timing-type) $(addsuffix .o,$(timing-type))
|
2013-04-16 20:07:24 +08:00
|
|
|
|
|
2014-03-29 12:07:44 +08:00
|
|
|
|
bench: $(timing-type) bench-set bench-func
|
2013-04-16 20:07:24 +08:00
|
|
|
|
|
|
|
|
|
bench-set: $(binaries-benchset)
|
|
|
|
|
for run in $^; do \
|
|
|
|
|
echo "Running $${run}"; \
|
|
|
|
|
$(run-bench) > $${run}.out; \
|
|
|
|
|
done
|
2013-04-16 16:37:21 +08:00
|
|
|
|
|
2014-03-29 12:07:44 +08:00
|
|
|
|
# Build and execute the benchmark functions. This target generates JSON
|
|
|
|
|
# formatted bench.out. Each of the programs produce independent JSON output,
|
|
|
|
|
# so one could even execute them individually and process it using any JSON
|
|
|
|
|
# capable language or tool.
|
2013-04-16 20:07:24 +08:00
|
|
|
|
bench-func: $(binaries-bench)
|
2014-04-08 17:18:16 +08:00
|
|
|
|
{ timing_type=$$($(timing-type)); \
|
|
|
|
|
echo "{\"timing_type\": \"$${timing_type}\","; \
|
|
|
|
|
echo " \"functions\": {"; \
|
2014-03-29 12:07:44 +08:00
|
|
|
|
for run in $^; do \
|
|
|
|
|
if ! [ "x$${run}" = "x$<" ]; then \
|
|
|
|
|
echo ","; \
|
|
|
|
|
fi; \
|
2013-04-15 16:22:26 +08:00
|
|
|
|
echo "Running $${run}" >&2; \
|
2014-03-29 12:10:19 +08:00
|
|
|
|
$(run-bench) $(DETAILED_OPT); \
|
2014-03-29 12:07:44 +08:00
|
|
|
|
done; \
|
2014-04-08 17:18:16 +08:00
|
|
|
|
echo; \
|
|
|
|
|
echo " }"; \
|
2014-03-29 12:07:44 +08:00
|
|
|
|
echo "}"; } > $(objpfx)bench.out-tmp; \
|
2013-04-12 17:31:44 +08:00
|
|
|
|
if [ -f $(objpfx)bench.out ]; then \
|
|
|
|
|
mv -f $(objpfx)bench.out $(objpfx)bench.out.old; \
|
|
|
|
|
fi; \
|
|
|
|
|
mv -f $(objpfx)bench.out-tmp $(objpfx)bench.out
|
|
|
|
|
|
2014-04-08 17:18:16 +08:00
|
|
|
|
$(timing-type) $(binaries-bench) $(binaries-benchset): %: %.o $(objpfx)json-lib.o \
|
2013-04-12 17:31:44 +08:00
|
|
|
|
$(sort $(filter $(common-objpfx)lib%,$(link-libc))) \
|
|
|
|
|
$(addprefix $(csu-objpfx),start.o) $(+preinit) $(+postinit)
|
|
|
|
|
$(+link)
|
|
|
|
|
|
2013-04-15 13:47:01 +08:00
|
|
|
|
$(objpfx)bench-%.c: %-inputs $(bench-deps)
|
2013-04-12 17:31:44 +08:00
|
|
|
|
{ if [ -n "$($*-INCLUDE)" ]; then \
|
|
|
|
|
cat $($*-INCLUDE); \
|
|
|
|
|
fi; \
|
2014-03-24 23:46:36 +08:00
|
|
|
|
$(.)scripts/bench.py $(patsubst %-inputs,%,$<); } > $@-tmp
|
2013-04-12 17:31:44 +08:00
|
|
|
|
mv -f $@-tmp $@
|