diff --git a/test/Makefile.am b/test/Makefile.am index 0ffe132e..7bb1675d 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -25,7 +25,8 @@ testsuite_LDFLAGS = $(top_builddir)/src/liblol.a @LOL_LIBS@ @PIPI_LIBS@ testsuite_DEPENDENCIES = $(top_builddir)/src/liblol.a benchsuite_SOURCES = benchsuite.cpp \ - benchmark/matrix.cpp benchmark/half.cpp benchmark/trig.cpp + benchmark/matrix.cpp benchmark/half.cpp benchmark/trig.cpp \ + benchmark/real.cpp benchsuite_CPPFLAGS = @LOL_CFLAGS@ @PIPI_CFLAGS@ benchsuite_LDFLAGS = $(top_builddir)/src/liblol.a @LOL_LIBS@ @PIPI_LIBS@ benchsuite_DEPENDENCIES = $(top_builddir)/src/liblol.a diff --git a/test/benchmark/real.cpp b/test/benchmark/real.cpp new file mode 100644 index 00000000..d37781d7 --- /dev/null +++ b/test/benchmark/real.cpp @@ -0,0 +1,69 @@ +// +// Lol Engine - Benchmark program +// +// Copyright: (c) 2005-2011 Sam Hocevar +// This program is free software; you can redistribute it and/or +// modify it under the terms of the Do What The Fuck You Want To +// Public License, Version 2, as published by Sam Hocevar. See +// http://sam.zoy.org/projects/COPYING.WTFPL for more details. +// + +#if defined HAVE_CONFIG_H +# include "config.h" +#endif + +#include + +#include "core.h" + +using namespace std; +using namespace lol; + +static size_t const REAL_TABLE_SIZE = 10000; +static size_t const REAL_RUNS = 50; + +void bench_real(int mode) +{ + float result[12] = { 0.0f }; + Timer timer; + + for (size_t run = 0; run < REAL_RUNS; run++) + { + switch (mode) + { + case 1: + break; + } + + real fib1 = 1.0, fib2 = 1.0; + timer.GetMs(); + for (size_t i = 0; i < REAL_TABLE_SIZE; i++) + { + real tmp = fib1 + fib2; + fib1 = fib2; + fib2 = tmp; + } + result[0] += timer.GetMs(); + + real fact = 1.0; + timer.GetMs(); + for (size_t i = 0; i < REAL_TABLE_SIZE; i++) + fact = fact * real(1.0 + i); + result[1] += timer.GetMs(); + + real invfact = 1.0; + timer.GetMs(); + for (size_t i = 0; i < REAL_TABLE_SIZE; i++) + invfact = invfact / real(1.0 + i); + result[2] += timer.GetMs(); + } + + for (size_t i = 0; i < sizeof(result) / sizeof(*result); i++) + result[i] *= 1000000.0f / (REAL_TABLE_SIZE * REAL_RUNS); + + Log::Info(" ns/elem\n"); + Log::Info("real = real + real %7.3f\n", result[0]); + Log::Info("real = real * real %7.3f\n", result[1]); + Log::Info("real = real / real %7.3f\n", result[2]); +} + diff --git a/test/benchsuite.cpp b/test/benchsuite.cpp index 1d5a6199..31e11d45 100644 --- a/test/benchsuite.cpp +++ b/test/benchsuite.cpp @@ -23,12 +23,18 @@ using namespace std; using namespace lol; +void bench_real(int mode); void bench_trig(int mode); void bench_matrix(int mode); void bench_half(int mode); int main(int argc, char **argv) { + Log::Info("-----------------------\n"); + Log::Info(" High precision floats\n"); + Log::Info("-----------------------\n"); + bench_real(1); + Log::Info("--------------------------\n"); Log::Info(" Trigonometry [-1e5, 1e5]\n"); Log::Info("--------------------------\n");