From a468fde11af59c6c43c5164fde9c4a81d3763f80 Mon Sep 17 00:00:00 2001 From: Tavian Barnes Date: Fri, 21 May 2010 14:04:47 -0600 Subject: Add list benchmark. --- bench/libdimension/Makefile.am | 10 +-- bench/libdimension/list.c | 134 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 140 insertions(+), 4 deletions(-) create mode 100644 bench/libdimension/list.c diff --git a/bench/libdimension/Makefile.am b/bench/libdimension/Makefile.am index 1aa19c0..bf14727 100644 --- a/bench/libdimension/Makefile.am +++ b/bench/libdimension/Makefile.am @@ -19,17 +19,19 @@ INCLUDES = -I$(top_srcdir)/libdimension -EXTRA_PROGRAMS = bench-array bench-geometry bench-prtree +EXTRA_PROGRAMS = bench-array bench-list bench-geometry bench-prtree -AM_CFLAGS = $(libsandglass_CFLAGS) -fno-inline +AM_CFLAGS = $(libsandglass_CFLAGS) -fno-inline AM_LDFLAGS = $(libsandglass_LIBS) $(top_builddir)/libdimension/libdimension.la bench_array_SOURCES = array.c +bench_list_SOURCES = list.c bench_geometry_SOURCES = geometry.c -bench_prtree_SOURCES = prtree.c +bench_prtree_SOURCES = prtree.c -bench: bench-array$(EXEEXT) bench-geometry$(EXEEXT) bench-prtree$(EXEEXT) +bench: bench-array$(EXEEXT) bench-list$(EXEEXT) bench-geometry$(EXEEXT) bench-prtree$(EXEEXT) ./bench-array$(EXEEXT) + ./bench-list$(EXEEXT) ./bench-geometry$(EXEEXT) ./bench-prtree$(EXEEXT) diff --git a/bench/libdimension/list.c b/bench/libdimension/list.c new file mode 100644 index 0000000..595ac7c --- /dev/null +++ b/bench/libdimension/list.c @@ -0,0 +1,134 @@ +/************************************************************************* + * Copyright (C) 2009-2010 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 "dimension.h" +#include +#include +#include +#include + +bool +dmnsn_comparator(dmnsn_list_iterator *i, dmnsn_list_iterator *j) +{ + uint32_t a, b; + dmnsn_list_get(i, &a); + dmnsn_list_get(j, &b); + return a < b; +} + +int +main() +{ + const size_t count = 32; + uint32_t object = 1; + + sandglass_t sandglass; + if (sandglass_init_monotonic(&sandglass, SANDGLASS_CPUTIME) != 0) { + perror("sandglass_create()"); + return EXIT_FAILURE; + } + + /* Benchmark allocation and deallocation */ + dmnsn_list *list; + sandglass_bench_fine(&sandglass, { + list = dmnsn_new_list(sizeof(object)); + dmnsn_delete_list(list); + }); + printf("dmnsn_new_list() + dmnsn_delete_list(): %ld\n", sandglass.grains); + + /* Create our test list */ + list = dmnsn_new_list(sizeof(object)); + + /* dmnsn_list_push() */ + + printf("dmnsn_list_push():"); + + for (size_t i = 0; i < count; ++i) { + sandglass_bench_noprecache(&sandglass, dmnsn_list_push(list, &object)); + printf(" %ld", sandglass.grains); + } + printf("\n"); + + /* dmnsn_list_first() */ + dmnsn_list_iterator *ii; + sandglass_bench_fine(&sandglass, ii = dmnsn_list_first(list)); + printf("dmnsn_list_first(): %ld\n", sandglass.grains); + + /* dmnsn_list_last() */ + sandglass_bench_fine(&sandglass, ii = dmnsn_list_last(list)); + printf("dmnsn_list_last(): %ld\n", sandglass.grains); + + /* dmnsn_list_get() */ + sandglass_bench_fine(&sandglass, dmnsn_list_get(ii, &object)); + printf("dmnsn_list_get(): %ld\n", sandglass.grains); + + /* dmnsn_list_set() */ + sandglass_bench_fine(&sandglass, dmnsn_list_set(ii, &object)); + printf("dmnsn_list_set(): %ld\n", sandglass.grains); + + /* dmnsn_list_size() */ + size_t size; + sandglass_bench_fine(&sandglass, size = dmnsn_list_size(list)); + printf("dmnsn_list_size(): %ld\n", sandglass.grains); + + /* dmnsn_list_insert() */ + + printf("dmnsn_list_insert():"); + + for (size_t i = 0; i < count; ++i) { + sandglass_bench_noprecache(&sandglass, + dmnsn_list_insert(list, ii, &object)); + printf(" %ld", sandglass.grains); + } + printf("\n"); + + /* dmnsn_list_split() */ + dmnsn_list *split; + sandglass_bench_noprecache(&sandglass, split = dmnsn_list_split(list)); + printf("dmnsn_list_split(): %ld\n", sandglass.grains); + + /* dmnsn_list_sort() */ + sandglass_bench(&sandglass, dmnsn_list_sort(list, &dmnsn_comparator)); + printf("dmnsn_list_sort(): %ld\n", sandglass.grains); + + /* dmnsn_list_remove() */ + + printf("dmnsn_list_remove():"); + + for (size_t i = 0; i < count; ++i) { + ii = dmnsn_list_last(split); + sandglass_bench_noprecache(&sandglass, + dmnsn_list_remove(split, ii)); + printf(" %ld", sandglass.grains); + } + printf("\n"); + + /* dmnsn_list_pop() */ + + printf("dmnsn_list_pop():"); + + for (size_t i = 0; i < count; ++i) { + sandglass_bench_noprecache(&sandglass, dmnsn_list_pop(list, &object)); + printf(" %ld", sandglass.grains); + } + printf("\n"); + + dmnsn_delete_list(list); + return EXIT_SUCCESS; +} -- cgit v1.2.3