From 744f4ac98d7b0a0e3a3184a60174bfe12f2a2f1f Mon Sep 17 00:00:00 2001 From: Sam Hocevar Date: Thu, 1 Sep 2011 17:39:36 +0000 Subject: [PATCH] test: add benchmark tests for trigonometry functions. --- test/lol-bench.cpp | 90 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) diff --git a/test/lol-bench.cpp b/test/lol-bench.cpp index c647cb14..392aa96b 100644 --- a/test/lol-bench.cpp +++ b/test/lol-bench.cpp @@ -14,23 +14,41 @@ #include +#if defined HAVE_FASTMATH_H +# include +#endif + #include "core.h" #include "loldebug.h" using namespace std; using namespace lol; +static size_t const TRIG_TABLE_SIZE = 128 * 1024; +static size_t const TRIG_RUNS = 50; + static size_t const MATRIX_TABLE_SIZE = 64 * 1024; static size_t const MATRIX_RUNS = 100; static size_t const HALF_TABLE_SIZE = 1024 * 1024; static size_t const HALF_RUNS = 50; +static void bench_trig(int mode); static void bench_matrix(int mode); static void bench_half(int mode); int main(int argc, char **argv) { + Log::Info("--------------------------\n"); + Log::Info(" Trigonometry [-1e5, 1e5]\n"); + Log::Info("--------------------------\n"); + bench_trig(1); + + Log::Info("------------------------\n"); + Log::Info(" Trigonometry [-pi, pi]\n"); + Log::Info("------------------------\n"); + bench_trig(2); + Log::Info("----------------------------\n"); Log::Info(" Float matrices [-2.0, 2.0]\n"); Log::Info("----------------------------\n"); @@ -49,6 +67,78 @@ int main(int argc, char **argv) return EXIT_SUCCESS; } +static void bench_trig(int mode) +{ + float result[5] = { 0.0f }; + Timer timer; + + /* Set up tables */ + float *pf = new float[TRIG_TABLE_SIZE]; + float *pf2 = new float[TRIG_TABLE_SIZE]; + + for (size_t run = 0; run < TRIG_RUNS; run++) + { + switch (mode) + { + case 1: + for (size_t i = 0; i < TRIG_TABLE_SIZE; i++) + pf[i] = RandF(-1e5f, 1e5f); + break; + case 2: + for (size_t i = 0; i < TRIG_TABLE_SIZE; i++) + pf[i] = RandF(-M_PI, M_PI); + break; + } + + /* Sin */ + timer.GetMs(); + for (size_t i = 0; i < TRIG_TABLE_SIZE; i++) + pf2[i] = __builtin_sinf(pf[i]); + result[0] += timer.GetMs(); + + /* Fast sin */ + timer.GetMs(); + for (size_t i = 0; i < TRIG_TABLE_SIZE; i++) +#if defined HAVE_FASTMATH_H + pf2[i] = f_sinf(pf[i]); +#else + pf2[i] = sinf(pf[i]); +#endif + result[1] += timer.GetMs(); + + /* Lol sin */ + timer.GetMs(); + for (size_t i = 0; i < TRIG_TABLE_SIZE; i++) + pf2[i] = lol_sin(pf[i]); + result[2] += timer.GetMs(); + + /* Cos */ + timer.GetMs(); + for (size_t i = 0; i < TRIG_TABLE_SIZE; i++) + pf2[i] = __builtin_cosf(pf[i]); + result[3] += timer.GetMs(); + + /* Tan */ + timer.GetMs(); + for (size_t i = 0; i < TRIG_TABLE_SIZE; i++) + pf2[i] = __builtin_tanf(pf[i]); + result[4] += timer.GetMs(); + } + + delete[] pf; + delete[] pf2; + + for (size_t i = 0; i < sizeof(result) / sizeof(*result); i++) + result[i] *= 1000000.0f / (TRIG_TABLE_SIZE * TRIG_RUNS); + + Log::Info(" ns/elem\n"); + Log::Info("float = sinf(float) %7.3f\n", result[0]); + Log::Info("float = fastsinf(float) %7.3f\n", result[1]); + Log::Info("float = lol_sinf(float) %7.3f\n", result[2]); + Log::Info("float = cosf(float) %7.3f\n", result[3]); + Log::Info("float = tanf(float) %7.3f\n", result[4]); +} + static void bench_matrix(int mode) { float result[5] = { 0.0f };