From 273761db64335b4dd647f538efbd69a3823c5319 Mon Sep 17 00:00:00 2001 From: Tavian Barnes Date: Sun, 4 Oct 2009 19:05:15 +0000 Subject: New benchmarking suite. --- .gitignore | 3 + Makefile.am | 12 ++- bench/Makefile.am | 25 ++++++ bench/libdimension/Makefile.am | 30 +++++++ bench/libdimension/array.c | 178 +++++++++++++++++++++++++++++++++++++++++ configure.ac | 11 ++- libdimension/dimension/array.h | 3 +- tests/libdimension/Makefile.am | 6 +- 8 files changed, 260 insertions(+), 8 deletions(-) create mode 100644 bench/Makefile.am create mode 100644 bench/libdimension/Makefile.am create mode 100644 bench/libdimension/array.c diff --git a/.gitignore b/.gitignore index bb691ed..ffb0082 100644 --- a/.gitignore +++ b/.gitignore @@ -41,6 +41,9 @@ Makefile.in /tests/*/*-test /tests/*.png +# Files created by `make bench' +/bench/*/bench-* + # Files and folders created by libtool .libs/ *.l[oa] diff --git a/Makefile.am b/Makefile.am index 574df64..b474efa 100644 --- a/Makefile.am +++ b/Makefile.am @@ -18,8 +18,14 @@ ########################################################################### ACLOCAL_AMFLAGS = -I m4 -SUBDIRS = doc \ - libdimension \ - tests +SUBDIRS = libdimension \ + tests \ + bench \ + doc EXTRA_DIST = autogen.sh + +bench: all-recursive + cd bench && $(MAKE) $(AM_MAKEFLAGS) bench + +.PHONY: bench diff --git a/bench/Makefile.am b/bench/Makefile.am new file mode 100644 index 0000000..7c5428d --- /dev/null +++ b/bench/Makefile.am @@ -0,0 +1,25 @@ +########################################################################### +## Copyright (C) 2009 Tavian Barnes ## +## ## +## This file is part of The Dimension Build Suite. ## +## ## +## The Dimension Build Suite is free software; you can redistribute it ## +## and/or modify it under the terms of the GNU General Public License as ## +## published by the Free Software Foundation; either version 3 of the ## +## License, or (at your option) any later version. ## +## ## +## The Dimension Build Suite 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 ## +## General Public License for more details. ## +## ## +## You should have received a copy of the GNU General Public License ## +## along with this program. If not, see . ## +########################################################################### + +SUBDIRS = libdimension + +bench: all-recursive + cd libdimension && $(MAKE) $(AM_MAKEFLAGS) bench + +.PHONY: bench diff --git a/bench/libdimension/Makefile.am b/bench/libdimension/Makefile.am new file mode 100644 index 0000000..cc8c886 --- /dev/null +++ b/bench/libdimension/Makefile.am @@ -0,0 +1,30 @@ +########################################################################### +## Copyright (C) 2009 Tavian Barnes ## +## ## +## This file is part of The Dimension Build Suite. ## +## ## +## The Dimension Build Suite is free software; you can redistribute it ## +## and/or modify it under the terms of the GNU General Public License as ## +## published by the Free Software Foundation; either version 3 of the ## +## License, or (at your option) any later version. ## +## ## +## The Dimension Build Suite 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 ## +## General Public License for more details. ## +## ## +## You should have received a copy of the GNU General Public License ## +## along with this program. If not, see . ## +########################################################################### + +INCLUDES = -I$(top_srcdir)/libdimension + +EXTRA_PROGRAMS = bench-array + +bench_array_SOURCES = array.c +bench_array_LDADD = -lsandglass $(top_srcdir)/libdimension/libdimension.la + +bench: bench-array$(EXEEXT) + ./bench-array$(EXEEXT) + +.PHONY: bench diff --git a/bench/libdimension/array.c b/bench/libdimension/array.c new file mode 100644 index 0000000..661ba51 --- /dev/null +++ b/bench/libdimension/array.c @@ -0,0 +1,178 @@ +/************************************************************************* + * Copyright (C) 2009 Tavian Barnes * + * * + * This file is part of The Dimension Benchmark Suite. * + * * + * The Dimension Benchmark Suite is free software; you can redistribute * + * it and/or modify it under the terms of the GNU General Public License * + * as published by the Free Software Foundation; either version 3 of the * + * License, or (at your option) any later version. * + * * + * The Dimension Benchmark Suite 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 General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + *************************************************************************/ + +#include +#include +#include +#include + +int +main() +{ + dmnsn_array *array; + uint32_t object = 1; + void *ptr; + size_t size; + unsigned int i; + const unsigned int count = 32; + + sandglass_t sandglass; + sandglass_attributes_t attr = { SANDGLASS_MONOTONIC, SANDGLASS_REALTICKS }; + + if (sandglass_create(&sandglass, &attr, &attr) != 0) { + perror("sandglass_create()"); + return EXIT_FAILURE; + } + + /* Benchmark allocation and deallocation */ + sandglass_bench(&sandglass, { + array = dmnsn_new_array(sizeof(object)); + dmnsn_delete_array(array); + }); + printf("dmnsn_new_array() + dmnsn_delete_array(): %ld\n", sandglass.grains); + + /* Create our test array */ + array = dmnsn_new_array(sizeof(object)); + + /* dmnsn_array_push() */ + + printf("dmnsn_array_push():"); + + sandglass_begin(&sandglass); + sandglass_elapse(&sandglass); + + sandglass_begin(&sandglass); + sandglass_elapse(&sandglass); + sandglass.baseline = sandglass.grains; + + for (i = 0; i < count; ++i) { + sandglass_begin(&sandglass); + dmnsn_array_push(array, &object); + sandglass_elapse(&sandglass); + sandglass.grains -= sandglass.baseline; + + printf(" %ld", sandglass.grains); + } + printf("\n"); + + /* dmnsn_array_get() */ + sandglass_bench(&sandglass, dmnsn_array_get(array, count/2, &object)); + printf("dmnsn_array_get(): %ld\n", sandglass.grains); + + /* dmnsn_array_set() */ + sandglass_bench(&sandglass, dmnsn_array_set(array, count/2, &object)); + printf("dmnsn_array_set(): %ld\n", sandglass.grains); + + /* dmnsn_array_at() */ + sandglass_bench(&sandglass, ptr = dmnsn_array_at(array, count/2)); + printf("dmnsn_array_at(): %ld\n", sandglass.grains); + + /* dmnsn_array_size() */ + sandglass_bench(&sandglass, size = dmnsn_array_size(array)); + printf("dmnsn_array_size(): %ld\n", sandglass.grains); + + /* dmnsn_array_resize() */ + + dmnsn_array_resize(array, count); + + sandglass_begin(&sandglass); + sandglass_elapse(&sandglass); + + sandglass_begin(&sandglass); + sandglass_elapse(&sandglass); + sandglass.baseline = sandglass.grains; + + sandglass_begin(&sandglass); + dmnsn_array_resize(array, count * 2); + sandglass_elapse(&sandglass); + sandglass.grains -= sandglass.baseline; + printf("dmnsn_array_resize(): %ld", sandglass.grains); + + sandglass_begin(&sandglass); + dmnsn_array_resize(array, count); + sandglass_elapse(&sandglass); + sandglass.grains -= sandglass.baseline; + printf(" %ld\n", sandglass.grains); + + /* dmnsn_array_insert() */ + + printf("dmnsn_array_insert():"); + + sandglass_begin(&sandglass); + sandglass_elapse(&sandglass); + + sandglass_begin(&sandglass); + sandglass_elapse(&sandglass); + sandglass.baseline = sandglass.grains; + + for (i = 0; i < count; ++i) { + sandglass_begin(&sandglass); + dmnsn_array_insert(array, count/2, &object); + sandglass_elapse(&sandglass); + sandglass.grains -= sandglass.baseline; + + printf(" %ld", sandglass.grains); + } + printf("\n"); + + /* dmnsn_array_remove() */ + + printf("dmnsn_array_remove():"); + + sandglass_begin(&sandglass); + sandglass_elapse(&sandglass); + + sandglass_begin(&sandglass); + sandglass_elapse(&sandglass); + sandglass.baseline = sandglass.grains; + + for (i = 0; i < count; ++i) { + sandglass_begin(&sandglass); + dmnsn_array_remove(array, count/2); + sandglass_elapse(&sandglass); + sandglass.grains -= sandglass.baseline; + + printf(" %ld", sandglass.grains); + } + printf("\n"); + + /* dmnsn_array_pop() */ + + printf("dmnsn_array_pop():"); + + sandglass_begin(&sandglass); + sandglass_elapse(&sandglass); + + sandglass_begin(&sandglass); + sandglass_elapse(&sandglass); + sandglass.baseline = sandglass.grains; + + for (i = 0; i < count; ++i) { + sandglass_begin(&sandglass); + dmnsn_array_pop(array, &object); + sandglass_elapse(&sandglass); + sandglass.grains -= sandglass.baseline; + + printf(" %ld", sandglass.grains); + } + printf("\n"); + + dmnsn_array_delet(array); + return EXIT_SUCCESS; +} diff --git a/configure.ac b/configure.ac index 503262a..2849b10 100644 --- a/configure.ac +++ b/configure.ac @@ -28,11 +28,18 @@ AC_PROG_LN_S AC_PROG_MAKE_SET AC_PROG_LIBTOOL +dnl Timing library for benchmarks +AC_CHECK_LIB([sandglass], [sandglass_create], + [], + [AC_MSG_WARN([libsandglass not found - benchmarking suite will not work correctly])]) + dnl Generate Makefiles AC_CONFIG_MACRO_DIR([m4]) AC_CONFIG_FILES([Makefile - doc/Makefile libdimension/Makefile tests/Makefile - tests/libdimension/Makefile]) + tests/libdimension/Makefile + bench/Makefile + bench/libdimension/Makefile + doc/Makefile]) AC_OUTPUT diff --git a/libdimension/dimension/array.h b/libdimension/dimension/array.h index d835d60..2154a9e 100644 --- a/libdimension/dimension/array.h +++ b/libdimension/dimension/array.h @@ -59,7 +59,8 @@ dmnsn_new_array(size_t obj_size) /* Delete the array */ DMNSN_INLINE void -dmnsn_delete_array(dmnsn_array *array) { +dmnsn_delete_array(dmnsn_array *array) +{ if (array) { free(array->ptr); free(array); diff --git a/tests/libdimension/Makefile.am b/tests/libdimension/Makefile.am index 3a0e15c..a3747d0 100644 --- a/tests/libdimension/Makefile.am +++ b/tests/libdimension/Makefile.am @@ -17,6 +17,8 @@ ## along with this program. If not, see . ## ########################################################################### +INCLUDES = -I$(top_srcdir)/libdimension + check_PROGRAMS = error-test \ warning-test TESTS = $(check_PROGRAMS) @@ -25,7 +27,7 @@ XFAIL_TESTS = error-test INCLUDES = -I$(top_srcdir)/libdimension error_test_SOURCES = error.c -error_test_LDADD = ../../libdimension/libdimension.la +error_test_LDADD = $(top_srcdir)/libdimension/libdimension.la warning_test_SOURCES = warning.c -warning_test_LDADD = ../../libdimension/libdimension.la +warning_test_LDADD = $(top_srcdir)/libdimension/libdimension.la -- cgit v1.2.3