Add more benchmarks, add subcount option

This commit is contained in:
2025-10-13 11:17:11 +03:00
parent 35b2e71753
commit 3f7b872f0f
20 changed files with 1479 additions and 22 deletions

View File

@@ -2,6 +2,9 @@
#define BH_BENCH_H #define BH_BENCH_H
#include <BH/Common.h>
typedef struct BH_Bench BH_Bench; typedef struct BH_Bench BH_Bench;
typedef void (*BH_BenchCallback)(BH_Bench *); typedef void (*BH_BenchCallback)(BH_Bench *);
@@ -21,6 +24,10 @@ void BH_BenchAdd(const char *name,
int BH_BenchIter(BH_Bench *state); int BH_BenchIter(BH_Bench *state);
void BH_BenchSubcount(BH_Bench *state,
size_t count);
int BH_BenchRun(void); int BH_BenchRun(void);

View File

@@ -14,6 +14,7 @@ struct BH_Bench
BH_BenchCallback cb; BH_BenchCallback cb;
int started; int started;
size_t iterations; size_t iterations;
size_t subcount;
}; };
@@ -51,6 +52,7 @@ void BH_BenchAdd(const char *name,
bench->cb = cb; bench->cb = cb;
bench->started = 0; bench->started = 0;
bench->iterations = 0; bench->iterations = 0;
bench->subcount = 1;
/* Append benchmark entry */ /* Append benchmark entry */
current = root; current = root;
@@ -84,8 +86,8 @@ int BH_BenchIter(BH_Bench *state)
if (millis > 1000 || state->iterations > 1000000000) if (millis > 1000 || state->iterations > 1000000000)
{ {
float ips, ns; float ips, ns;
ips = state->iterations / (millis / 1000.0f); ips = state->iterations / (millis / 1000.0f) * state->subcount;
ns = (millis * 1000000.0) / state->iterations; ns = (millis * 1000000.0) / state->iterations / state->subcount;
printf("%-12s %.2f ips (%.2f ns)\n", state->name, ips, ns); printf("%-12s %.2f ips (%.2f ns)\n", state->name, ips, ns);
return 0; return 0;
} }
@@ -93,6 +95,13 @@ int BH_BenchIter(BH_Bench *state)
} }
void BH_BenchSubcount(BH_Bench *state,
size_t count)
{
state->subcount = count;
}
int BH_BenchRun(void) int BH_BenchRun(void)
{ {
BH_Bench *current; BH_Bench *current;

169
bench/tests/BenchAlgo.c Normal file
View File

@@ -0,0 +1,169 @@
#include <BH/Bench.h>
#include <BH/Algo.h>
#define NUM_ENTRIES 1000
static int testArray[NUM_ENTRIES];
static int tempArray[NUM_ENTRIES];
static int pivotValue;
static int intEqual(const void *a, const void *b)
{
int ia, ib;
ia = *(const int*)a;
ib = *(const int*)b;
return (ia > ib) - (ia < ib);
}
static void algoSetup(void)
{
int i;
for (i = 0; i < NUM_ENTRIES; ++i)
{
testArray[i] = NUM_ENTRIES - i;
tempArray[i] = NUM_ENTRIES - i;
}
pivotValue = NUM_ENTRIES / 2;
}
BH_BENCH_TEST(Swap)
{
int a = 123;
int b = 456;
algoSetup();
while (BH_BenchIter(state))
{
BH_Swap(&a, &b, sizeof(int));
BH_BenchDoNotOptimize(a);
BH_BenchDoNotOptimize(b);
BH_Swap(&a, &b, sizeof(int));
}
}
BH_BENCH_TEST(Partition)
{
algoSetup();
while (BH_BenchIter(state))
{
void *pivot, *result;
for (int i = 0; i < NUM_ENTRIES; ++i)
testArray[i] = tempArray[i];
pivot = &pivotValue;
result = BH_Partition(pivot, testArray, NUM_ENTRIES, sizeof(int), intEqual);
BH_BenchDoNotOptimize(result);
BH_BenchDoNotOptimize(testArray);
}
}
BH_BENCH_TEST(Sort)
{
algoSetup();
while (BH_BenchIter(state))
{
int i;
for (i = 0; i < NUM_ENTRIES; ++i)
testArray[i] = tempArray[i];
BH_Sort(testArray, NUM_ENTRIES, sizeof(int), intEqual);
BH_BenchDoNotOptimize(testArray);
}
}
BH_BENCH_TEST(HeapMake)
{
algoSetup();
while (BH_BenchIter(state))
{
int i;
for (i = 0; i < NUM_ENTRIES; ++i)
testArray[i] = tempArray[i];
BH_HeapMake(testArray, NUM_ENTRIES, sizeof(int), intEqual);
BH_BenchDoNotOptimize(testArray);
}
}
BH_BENCH_TEST(HeapRemove)
{
algoSetup();
while (BH_BenchIter(state))
{
int i;
for (i = 0; i < NUM_ENTRIES; ++i)
testArray[i] = tempArray[i];
BH_HeapMake(testArray, NUM_ENTRIES, sizeof(int), intEqual);
BH_HeapRemove(testArray, NUM_ENTRIES, sizeof(int), intEqual);
BH_BenchDoNotOptimize(testArray);
}
}
BH_BENCH_TEST(HeapInsert)
{
algoSetup();
while (BH_BenchIter(state))
{
int i, value;
for (i = 0; i < NUM_ENTRIES - 1; ++i)
testArray[i] = tempArray[i];
testArray[NUM_ENTRIES - 1] = 0;
BH_HeapMake(testArray, NUM_ENTRIES - 1, sizeof(int), intEqual);
value = 250;
BH_HeapInsert(&value, testArray, NUM_ENTRIES - 1, sizeof(int), intEqual);
BH_BenchDoNotOptimize(testArray);
}
}
BH_BENCH_TEST(HeapReplace)
{
algoSetup();
while (BH_BenchIter(state))
{
int i, value;
for (i = 0; i < NUM_ENTRIES; ++i)
testArray[i] = tempArray[i];
BH_HeapMake(testArray, NUM_ENTRIES, sizeof(int), intEqual);
value = 100;
BH_HeapReplace(&value, testArray, NUM_ENTRIES, sizeof(int), intEqual);
BH_BenchDoNotOptimize(testArray);
}
}
int main(int argc, char **argv)
{
BH_UNUSED(argc);
BH_UNUSED(argv);
BH_BENCH_ADD(Swap);
BH_BENCH_ADD(Partition);
BH_BENCH_ADD(Sort);
BH_BENCH_ADD(HeapMake);
BH_BENCH_ADD(HeapRemove);
BH_BENCH_ADD(HeapInsert);
BH_BENCH_ADD(HeapReplace);
return BH_BenchRun();
}

View File

@@ -1,5 +1,5 @@
#include "BH/Bench.h" #include <BH/Bench.h>
#include "BH/Math/Box2f.h" #include <BH/Math/Box2f.h>

View File

@@ -1,5 +1,5 @@
#include "BH/Bench.h" #include <BH/Bench.h>
#include "BH/Math/Box3f.h" #include <BH/Math/Box3f.h>
static float boxAMin[3] = {1.0f, 2.0f, 3.0f}; static float boxAMin[3] = {1.0f, 2.0f, 3.0f};

136
bench/tests/BenchHashmap.c Normal file
View File

@@ -0,0 +1,136 @@
#include <BH/Bench.h>
#include <BH/Hashmap.h>
#include <stdio.h>
#define NUM_ENTRIES 1000
static int keys[NUM_ENTRIES];
static char values[NUM_ENTRIES][16];
static BH_Hashmap *map;
static BH_Hashmap *warmMap;
int BH_IntEqual(const void *a, const void *b)
{
return (*(const int*)a == *(const int*)b) ? 0 : 1;
}
size_t BH_IntHash(const void *key)
{
int k = *(const int*)key;
return (size_t)((k * 2654435761U) >> 8);
}
static void setupData(void)
{
int i;
for (i = 0; i < NUM_ENTRIES; ++i)
{
keys[i] = i + 1;
sprintf(values[i], "value_%d", i + 1);
}
}
static void setupWarmMap(void)
{
int i;
warmMap = BH_HashmapNew(BH_IntEqual, BH_IntHash);
for (i = 0; i < NUM_ENTRIES; ++i)
{
BH_HashmapInsert(warmMap, &keys[i], values[i]);
}
}
BH_BENCH_TEST(NewFree)
{
while (BH_BenchIter(state))
{
map = BH_HashmapNew(BH_IntEqual, BH_IntHash);
BH_BenchDoNotOptimize(map);
BH_HashmapFree(map);
}
}
BH_BENCH_TEST(ReserveInsert)
{
BH_BenchSubcount(state, NUM_ENTRIES);
while (BH_BenchIter(state))
{
map = BH_HashmapNew(BH_IntEqual, BH_IntHash);
BH_HashmapReserve(map, NUM_ENTRIES);
for (int i = 0; i < NUM_ENTRIES; ++i)
{
BH_HashmapInsert(map, &keys[i], values[i]);
}
BH_HashmapClear(map);
BH_BenchDoNotOptimize(map);
BH_HashmapFree(map);
}
}
BH_BENCH_TEST(Lookup)
{
BH_BenchSubcount(state, NUM_ENTRIES);
while (BH_BenchIter(state))
{
int i;
void *value = NULL;
for (i = 0; i < NUM_ENTRIES; ++i)
{
BH_HashmapAt(warmMap, &keys[i], &value);
}
BH_BenchDoNotOptimize(value);
}
}
BH_BENCH_TEST(Remove)
{
BH_BenchSubcount(state, NUM_ENTRIES);
while (BH_BenchIter(state))
{
int i;
map = BH_HashmapNew(BH_IntEqual, BH_IntHash);
for (i = 0; i < NUM_ENTRIES; ++i)
{
BH_HashmapInsert(map, &keys[i], values[i]);
}
for (i = 0; i < NUM_ENTRIES; ++i)
{
BH_HashmapRemove(map, &keys[i]);
}
BH_BenchDoNotOptimize(map);
BH_HashmapFree(map);
}
}
int main(int argc, char **argv)
{
BH_UNUSED(argc);
BH_UNUSED(argv);
setupData();
setupWarmMap();
BH_BENCH_ADD(NewFree);
BH_BENCH_ADD(ReserveInsert);
BH_BENCH_ADD(Lookup);
BH_BENCH_ADD(Remove);
return BH_BenchRun();
}

View File

@@ -1,5 +1,5 @@
#include "BH/Bench.h" #include <BH/Bench.h>
#include "BH/Math/Line.h" #include <BH/Math/Line.h>
static float pointA[2] = {1.0f, 2.0f}; static float pointA[2] = {1.0f, 2.0f};

190
bench/tests/BenchMat3f.c Normal file
View File

@@ -0,0 +1,190 @@
#include <BH/Bench.h>
#include <BH/Math/Mat3f.h>
static float matA[9] =
{
1.0f, 0.5f, 0.0f,
0.2f, 2.0f, 0.3f,
0.0f, 0.1f, 1.5f
};
static float matB[9] =
{
0.8f, 0.0f, 0.2f,
0.1f, 1.2f, 0.4f,
0.3f, 0.0f, 0.9f
};
static float outMat[9];
static float outInv[9];
static float vec3[3] = {1.5f, 2.5f, 1.0f};
static float vec2[2] = {3.0f, 4.0f};
static float outVec3[3];
static float outVec2[2];
BH_BENCH_TEST(Identity)
{
while (BH_BenchIter(state))
{
BH_Mat3fIdentity(outMat);
BH_BenchDoNotOptimize(outMat);
}
}
BH_BENCH_TEST(Add)
{
while (BH_BenchIter(state))
{
BH_Mat3fAdd(matA, matB, outMat);
BH_BenchDoNotOptimize(outMat);
}
}
BH_BENCH_TEST(Sub)
{
while (BH_BenchIter(state))
{
BH_Mat3fSub(matA, matB, outMat);
BH_BenchDoNotOptimize(outMat);
}
}
BH_BENCH_TEST(Mul)
{
while (BH_BenchIter(state))
{
BH_Mat3fMul(matA, matB, outMat);
BH_BenchDoNotOptimize(outMat);
}
}
BH_BENCH_TEST(Scale)
{
while (BH_BenchIter(state))
{
BH_Mat3fScale(matA, 2.5f, outMat);
BH_BenchDoNotOptimize(outMat);
}
}
BH_BENCH_TEST(Transpose)
{
while (BH_BenchIter(state))
{
BH_Mat3fTranspose(matA, outMat);
BH_BenchDoNotOptimize(outMat);
}
}
BH_BENCH_TEST(Trace)
{
while (BH_BenchIter(state))
{
float trace;
trace = BH_Mat3fTrace(matA);
BH_BenchDoNotOptimize(trace);
}
}
BH_BENCH_TEST(Det)
{
while (BH_BenchIter(state))
{
float det;
det = BH_Mat3fDet(matA);
BH_BenchDoNotOptimize(det);
}
}
BH_BENCH_TEST(Inverse)
{
while (BH_BenchIter(state))
{
int result;
result = BH_Mat3fInverse(matA, outInv);
BH_BenchDoNotOptimize(result);
BH_BenchDoNotOptimize(outInv);
}
}
BH_BENCH_TEST(FromScale)
{
while (BH_BenchIter(state))
{
BH_Mat3fFromScale(2.0f, 3.0f, outMat);
BH_BenchDoNotOptimize(outMat);
}
}
BH_BENCH_TEST(FromTranslation)
{
while (BH_BenchIter(state))
{
BH_Mat3fFromTranslation(4.0f, -2.0f, outMat);
BH_BenchDoNotOptimize(outMat);
}
}
BH_BENCH_TEST(FromRotation)
{
while (BH_BenchIter(state))
{
BH_Mat3fFromRotation(0.7854f, outMat);
BH_BenchDoNotOptimize(outMat);
}
}
BH_BENCH_TEST(ApplyVec3f)
{
while (BH_BenchIter(state))
{
BH_Mat3fApplyVec3f(matA, vec3, outVec3);
BH_BenchDoNotOptimize(outVec3);
}
}
BH_BENCH_TEST(ApplyVec2f)
{
while (BH_BenchIter(state))
{
BH_Mat3fApplyVec2f(matA, vec2, outVec2);
BH_BenchDoNotOptimize(outVec2);
}
}
int main(int argc, char **argv)
{
BH_UNUSED(argc);
BH_UNUSED(argv);
BH_BENCH_ADD(Identity);
BH_BENCH_ADD(Add);
BH_BENCH_ADD(Sub);
BH_BENCH_ADD(Mul);
BH_BENCH_ADD(Scale);
BH_BENCH_ADD(Transpose);
BH_BENCH_ADD(Trace);
BH_BENCH_ADD(Det);
BH_BENCH_ADD(Inverse);
BH_BENCH_ADD(FromScale);
BH_BENCH_ADD(FromTranslation);
BH_BENCH_ADD(FromRotation);
BH_BENCH_ADD(ApplyVec3f);
BH_BENCH_ADD(ApplyVec2f);
return BH_BenchRun();
}

285
bench/tests/BenchMat4f.c Normal file
View File

@@ -0,0 +1,285 @@
#include <BH/Bench.h>
#include <BH/Math/Mat4f.h>
static float matA[16] =
{
1.0f, 0.2f, 0.0f, 0.0f,
0.1f, 1.5f, 0.3f, 0.0f,
0.0f, 0.0f, 2.0f, 0.0f,
1.0f, 2.0f, 3.0f, 1.0f
};
static float matB[16] =
{
0.9f, 0.0f, 0.1f, 0.0f,
0.0f, 1.1f, 0.0f, 0.0f,
0.2f, 0.3f, 0.8f, 0.0f,
0.5f, 1.0f, 1.5f, 1.0f
};
static float outMat[16];
static float outInv[16];
static float vec4[4] = {1.0f, 2.0f, 3.0f, 1.0f};
static float vec3[3] = {4.0f, 5.0f, 6.0f};
static float outVec4[4];
static float outVec3[3];
static float quat[4] = {0.707f, 0.0f, 0.0f, 0.707f};
static float axis[3] = {0.577f, 0.577f, 0.577f};
static float camPos[3] = {0.0f, 0.0f, 5.0f};
static float camAt[3] = {0.0f, 0.0f, 0.0f};
static float camUp[3] = {0.0f, 1.0f, 0.0f};
BH_BENCH_TEST(Identity)
{
while (BH_BenchIter(state))
{
BH_Mat4fIdentity(outMat);
BH_BenchDoNotOptimize(outMat);
}
}
BH_BENCH_TEST(Add)
{
while (BH_BenchIter(state))
{
BH_Mat4fAdd(matA, matB, outMat);
BH_BenchDoNotOptimize(outMat);
}
}
BH_BENCH_TEST(Sub)
{
while (BH_BenchIter(state))
{
BH_Mat4fSub(matA, matB, outMat);
BH_BenchDoNotOptimize(outMat);
}
}
BH_BENCH_TEST(Mul)
{
while (BH_BenchIter(state))
{
BH_Mat4fMul(matA, matB, outMat);
BH_BenchDoNotOptimize(outMat);
}
}
BH_BENCH_TEST(Scale)
{
while (BH_BenchIter(state))
{
BH_Mat4fScale(matA, 1.5f, outMat);
BH_BenchDoNotOptimize(outMat);
}
}
BH_BENCH_TEST(Transpose)
{
while (BH_BenchIter(state))
{
BH_Mat4fTranspose(matA, outMat);
BH_BenchDoNotOptimize(outMat);
}
}
BH_BENCH_TEST(Trace)
{
while (BH_BenchIter(state))
{
float trace;
trace = BH_Mat4fTrace(matA);
BH_BenchDoNotOptimize(trace);
}
}
BH_BENCH_TEST(Det)
{
while (BH_BenchIter(state))
{
float det;
det = BH_Mat4fDet(matA);
BH_BenchDoNotOptimize(det);
}
}
BH_BENCH_TEST(Inverse)
{
while (BH_BenchIter(state))
{
int result;
result = BH_Mat4fInverse(matA, outInv);
BH_BenchDoNotOptimize(result);
BH_BenchDoNotOptimize(outInv);
}
}
BH_BENCH_TEST(FromScale)
{
while (BH_BenchIter(state))
{
BH_Mat4fFromScale(2.0f, 3.0f, 4.0f, outMat);
BH_BenchDoNotOptimize(outMat);
}
}
BH_BENCH_TEST(FromTranslation)
{
while (BH_BenchIter(state))
{
BH_Mat4fFromTranslation(1.0f, -1.0f, 2.5f, outMat);
BH_BenchDoNotOptimize(outMat);
}
}
BH_BENCH_TEST(FromRotationX)
{
while (BH_BenchIter(state))
{
BH_Mat4fFromRotationX(0.7854f, outMat);
BH_BenchDoNotOptimize(outMat);
}
}
BH_BENCH_TEST(FromRotationY)
{
while (BH_BenchIter(state))
{
BH_Mat4fFromRotationY(0.7854f, outMat);
BH_BenchDoNotOptimize(outMat);
}
}
BH_BENCH_TEST(FromRotationZ)
{
while (BH_BenchIter(state))
{
BH_Mat4fFromRotationZ(0.7854f, outMat);
BH_BenchDoNotOptimize(outMat);
}
}
BH_BENCH_TEST(FromAxis)
{
while (BH_BenchIter(state))
{
BH_Mat4fFromAxis(axis, 1.0472f, outMat);
BH_BenchDoNotOptimize(outMat);
}
}
BH_BENCH_TEST(FromEuler)
{
while (BH_BenchIter(state))
{
BH_Mat4fFromEuler(0.3f, 0.4f, 0.5f, outMat);
BH_BenchDoNotOptimize(outMat);
}
}
BH_BENCH_TEST(FromQuat4f)
{
while (BH_BenchIter(state))
{
BH_Mat4fFromQuat4f(quat, outMat);
BH_BenchDoNotOptimize(outMat);
}
}
BH_BENCH_TEST(FromOrtho)
{
while (BH_BenchIter(state))
{
BH_Mat4fFromOrtho(-4.0f, 4.0f, -3.0f, 3.0f, 0.1f, 100.0f, outMat);
BH_BenchDoNotOptimize(outMat);
}
}
BH_BENCH_TEST(FromFrustum)
{
while (BH_BenchIter(state))
{
BH_Mat4fFromFrustum(60.0f, 1.77f, 0.1f, 100.0f, outMat);
BH_BenchDoNotOptimize(outMat);
}
}
BH_BENCH_TEST(FromLookAt)
{
while (BH_BenchIter(state))
{
BH_Mat4fFromLookAt(camPos, camAt, camUp, outMat);
BH_BenchDoNotOptimize(outMat);
}
}
BH_BENCH_TEST(ApplyVec4f)
{
while (BH_BenchIter(state))
{
BH_Mat4fApplyVec4f(matA, vec4, outVec4);
BH_BenchDoNotOptimize(outVec4);
}
}
BH_BENCH_TEST(ApplyVec3f)
{
while (BH_BenchIter(state))
{
BH_Mat4fApplyVec3f(matA, vec3, outVec3);
BH_BenchDoNotOptimize(outVec3);
}
}
int main(int argc, char **argv)
{
BH_UNUSED(argc);
BH_UNUSED(argv);
BH_BENCH_ADD(Identity);
BH_BENCH_ADD(Add);
BH_BENCH_ADD(Sub);
BH_BENCH_ADD(Mul);
BH_BENCH_ADD(Scale);
BH_BENCH_ADD(Transpose);
BH_BENCH_ADD(Trace);
BH_BENCH_ADD(Det);
BH_BENCH_ADD(Inverse);
BH_BENCH_ADD(FromScale);
BH_BENCH_ADD(FromTranslation);
BH_BENCH_ADD(FromRotationX);
BH_BENCH_ADD(FromRotationY);
BH_BENCH_ADD(FromRotationZ);
BH_BENCH_ADD(FromAxis);
BH_BENCH_ADD(FromEuler);
BH_BENCH_ADD(FromQuat4f);
BH_BENCH_ADD(FromOrtho);
BH_BENCH_ADD(FromFrustum);
BH_BENCH_ADD(FromLookAt);
BH_BENCH_ADD(ApplyVec4f);
BH_BENCH_ADD(ApplyVec3f);
return BH_BenchRun();
}

View File

@@ -1,5 +1,5 @@
#include "BH/Bench.h" #include <BH/Bench.h>
#include "BH/Math/Plane.h" #include <BH/Math/Plane.h>
static float pointA[3] = {1.0f, 2.0f, 3.0f}; static float pointA[3] = {1.0f, 2.0f, 3.0f};

117
bench/tests/BenchQueue.c Normal file
View File

@@ -0,0 +1,117 @@
#include <BH/Bench.h>
#include <BH/Queue.h>
#define NUM_ENTRIES 1000
static int values[NUM_ENTRIES];
static BH_Queue *queue;
static void *frontValue;
static void *iter;
static void *iterValue;
static void setupData()
{
int i;
queue = BH_QueueNew();
for (i = 0; i < NUM_ENTRIES; ++i)
{
values[i] = i + 1;
BH_QueueInsert(queue, &values[i]);
}
}
BH_BENCH_TEST(NewFree)
{
while (BH_BenchIter(state))
{
queue = BH_QueueNew();
BH_BenchDoNotOptimize(queue);
if (queue) BH_QueueFree(queue);
}
}
BH_BENCH_TEST(ReserveInsert)
{
BH_BenchSubcount(state, NUM_ENTRIES);
while (BH_BenchIter(state))
{
int i;
queue = BH_QueueNew();
BH_QueueReserve(queue, NUM_ENTRIES);
for (i = 0; i < NUM_ENTRIES; ++i)
{
values[i] = i + 1;
BH_QueueInsert(queue, &values[i]);
}
BH_BenchDoNotOptimize(queue);
BH_QueueFree(queue);
}
}
BH_BENCH_TEST(FrontRemove)
{
BH_BenchSubcount(state, NUM_ENTRIES);
while (BH_BenchIter(state))
{
int i;
queue = BH_QueueNew();
for (i = 0; i < NUM_ENTRIES; ++i)
{
values[i] = i + 1;
BH_QueueInsert(queue, &values[i]);
}
for (i = 0; i < NUM_ENTRIES; ++i)
{
if (BH_QueueFront(queue, &frontValue) == 0)
{
BH_QueueRemove(queue);
}
}
BH_BenchDoNotOptimize(frontValue);
BH_BenchDoNotOptimize(queue);
BH_QueueFree(queue);
}
}
BH_BENCH_TEST(Iterate)
{
setupData();
BH_BenchSubcount(state, NUM_ENTRIES);
while (BH_BenchIter(state))
{
iter = NULL;
iterValue = NULL;
while ((iter = BH_QueueIterNext(queue, iter)) != NULL)
{
iterValue = BH_QueueIterValue(iter);
}
BH_BenchDoNotOptimize(iterValue);
}
BH_QueueFree(queue);
}
int main(int argc, char **argv)
{
BH_UNUSED(argc);
BH_UNUSED(argv);
BH_BENCH_ADD(NewFree);
BH_BENCH_ADD(ReserveInsert);
BH_BENCH_ADD(FrontRemove);
BH_BENCH_ADD(Iterate);
return BH_BenchRun();
}

143
bench/tests/BenchRay2f.c Normal file
View File

@@ -0,0 +1,143 @@
#include <BH/Bench.h>
#include <BH/Math/Ray2f.h>
static float rayAStart[2] = {1.0f, 1.0f};
static float rayADir[2] = {1.0f, 0.5f};
static float rayBStart[2] = {3.0f, 0.0f};
static float rayBDir[2] = {-0.5f, 1.0f};
static float lineEq[3] = {1.0f, 1.0f, -4.0f};
static float segStart[2] = {0.0f, 3.0f};
static float segEnd[2] = {5.0f, 2.0f};
static float boxMin[2] = {2.0f, 2.0f};
static float boxMax[2] = {6.0f, 5.0f};
static float outPoint[2];
BH_BENCH_TEST(IntersectLine)
{
while (BH_BenchIter(state))
{
float t;
int result;
result = BH_Ray2fIntersectLine(rayAStart, rayADir, lineEq, &t, outPoint);
BH_BenchDoNotOptimize(result);
BH_BenchDoNotOptimize(t);
BH_BenchDoNotOptimize(outPoint);
}
}
BH_BENCH_TEST(IntersectTime)
{
while (BH_BenchIter(state))
{
float time1, time2;
int result;
result = BH_Ray2fIntersectTime(rayAStart, rayADir, rayBStart, rayBDir, &time1, &time2);
BH_BenchDoNotOptimize(result);
BH_BenchDoNotOptimize(time1);
BH_BenchDoNotOptimize(time2);
}
}
BH_BENCH_TEST(IntersectRay)
{
while (BH_BenchIter(state))
{
float t;
int result;
result = BH_Ray2fIntersectRay(rayAStart, rayADir, rayBStart, rayBDir, &t, outPoint);
BH_BenchDoNotOptimize(result);
BH_BenchDoNotOptimize(t);
BH_BenchDoNotOptimize(outPoint);
}
}
BH_BENCH_TEST(IntersectSegment)
{
while (BH_BenchIter(state))
{
float t;
int result;
result = BH_Ray2fIntersectSegment(rayAStart, rayADir, segStart, segEnd, &t, outPoint);
BH_BenchDoNotOptimize(result);
BH_BenchDoNotOptimize(t);
BH_BenchDoNotOptimize(outPoint);
}
}
BH_BENCH_TEST(SegmentIntersectLine)
{
while (BH_BenchIter(state))
{
float t;
int result;
result = BH_Segment2fIntersectLine(segStart, segEnd, lineEq, &t, outPoint);
BH_BenchDoNotOptimize(result);
BH_BenchDoNotOptimize(t);
BH_BenchDoNotOptimize(outPoint);
}
}
BH_BENCH_TEST(SegmentIntersectSegment)
{
while (BH_BenchIter(state))
{
float t;
int result;
result = BH_Segment2fIntersectSegment(segStart, segEnd, rayAStart, rayBStart, &t, outPoint);
BH_BenchDoNotOptimize(result);
BH_BenchDoNotOptimize(t);
BH_BenchDoNotOptimize(outPoint);
}
}
BH_BENCH_TEST(IntersectBox2f)
{
while (BH_BenchIter(state))
{
float t;
int result;
result = BH_Ray2fIntersectBox2f(rayAStart, rayADir, boxMin, boxMax, &t, outPoint);
BH_BenchDoNotOptimize(result);
BH_BenchDoNotOptimize(t);
BH_BenchDoNotOptimize(outPoint);
}
}
BH_BENCH_TEST(SegmentIntersectBox2f)
{
while (BH_BenchIter(state))
{
float t;
int result;
result = BH_Segment2fIntersectBox2f(segStart, segEnd, boxMin, boxMax, &t, outPoint);
BH_BenchDoNotOptimize(result);
BH_BenchDoNotOptimize(t);
BH_BenchDoNotOptimize(outPoint);
}
}
int main(int argc, char **argv)
{
BH_UNUSED(argc);
BH_UNUSED(argv);
BH_BENCH_ADD(IntersectLine);
BH_BENCH_ADD(IntersectTime);
BH_BENCH_ADD(IntersectRay);
BH_BENCH_ADD(IntersectSegment);
BH_BENCH_ADD(SegmentIntersectLine);
BH_BENCH_ADD(SegmentIntersectSegment);
BH_BENCH_ADD(IntersectBox2f);
BH_BENCH_ADD(SegmentIntersectBox2f);
return BH_BenchRun();
}

115
bench/tests/BenchRay3f.c Normal file
View File

@@ -0,0 +1,115 @@
#include <BH/Bench.h>
#include <BH/Math/Ray3f.h>
static float rayStart[3] = {0.0f, 0.0f, 0.0f};
static float rayDir[3] = {1.0f, 1.0f, 1.0f};
static float segStart[3] = {-2.0f, -2.0f, -2.0f};
static float segEnd[3] = {2.0f, 2.0f, 2.0f};
static float planeEq[4] = {1.0f, 1.0f, 1.0f, -3.0f};
static float triA[3] = {1.0f, 1.0f, 1.0f};
static float triB[3] = {2.0f, 1.0f, 0.0f};
static float triC[3] = {0.0f, 2.0f, 1.0f};
static float boxMin[3] = {1.0f, 1.0f, 1.0f};
static float boxMax[3] = {3.0f, 3.0f, 3.0f};
static float outPoint[3];
BH_BENCH_TEST(IntersectPlane)
{
while (BH_BenchIter(state))
{
float t;
int result;
result = BH_Ray3fIntersectPlane(rayStart, rayDir, planeEq, &t, outPoint);
BH_BenchDoNotOptimize(result);
BH_BenchDoNotOptimize(t);
BH_BenchDoNotOptimize(outPoint);
}
}
BH_BENCH_TEST(IntersectTriangle)
{
while (BH_BenchIter(state))
{
float t;
int result;
result = BH_Ray3fIntersectTriangle(rayStart, rayDir, triA, triB, triC, &t, outPoint);
BH_BenchDoNotOptimize(result);
BH_BenchDoNotOptimize(t);
BH_BenchDoNotOptimize(outPoint);
}
}
BH_BENCH_TEST(SegmentIntersectPlane)
{
while (BH_BenchIter(state))
{
float t;
int result;
result = BH_Segment3fIntersectPlane(segStart, segEnd, planeEq, &t, outPoint);
BH_BenchDoNotOptimize(result);
BH_BenchDoNotOptimize(t);
BH_BenchDoNotOptimize(outPoint);
}
}
BH_BENCH_TEST(SegmentIntersectTriangle)
{
while (BH_BenchIter(state))
{
float t;
int result;
result = BH_Segment3fIntersectTriangle(segStart, segEnd, triA, triB, triC, &t, outPoint);
BH_BenchDoNotOptimize(result);
BH_BenchDoNotOptimize(t);
BH_BenchDoNotOptimize(outPoint);
}
}
BH_BENCH_TEST(IntersectBox3f)
{
while (BH_BenchIter(state))
{
float t;
int result;
result = BH_Ray3fIntersectBox3f(rayStart, rayDir, boxMin, boxMax, &t, outPoint);
BH_BenchDoNotOptimize(result);
BH_BenchDoNotOptimize(t);
BH_BenchDoNotOptimize(outPoint);
}
}
BH_BENCH_TEST(SegmentIntersectBox3f)
{
while (BH_BenchIter(state))
{
float t;
int result;
result = BH_Segment3fIntersectBox3f(segStart, segEnd, boxMin, boxMax, &t, outPoint);
BH_BenchDoNotOptimize(result);
BH_BenchDoNotOptimize(t);
BH_BenchDoNotOptimize(outPoint);
}
}
int main(int argc, char **argv)
{
BH_UNUSED(argc);
BH_UNUSED(argv);
BH_BENCH_ADD(IntersectPlane);
BH_BENCH_ADD(IntersectTriangle);
BH_BENCH_ADD(SegmentIntersectPlane);
BH_BENCH_ADD(SegmentIntersectTriangle);
BH_BENCH_ADD(IntersectBox3f);
BH_BENCH_ADD(SegmentIntersectBox3f);
return BH_BenchRun();
}

286
bench/tests/BenchString.c Normal file
View File

@@ -0,0 +1,286 @@
#include <BH/Bench.h>
#include <BH/String.h>
#define BUF_SIZE 64
static char buffer[BUF_SIZE];
static size_t actual;
static double testDouble = 1234.5678;
static int8_t testInt8s = -128;
static int16_t testInt16s = -32768;
static int32_t testInt32s = -2147483647;
static int64_t testInt64s = -9223372036854775807LL;
static uint8_t testInt8u = 255;
static uint16_t testInt16u = 65535;
static uint32_t testInt32u = 4294967295U;
static uint64_t testInt64u = 18446744073709551615ULL;
static const char *strDouble = "1234.5678";
static const char *strInt8s = "-128";
static const char *strInt16s = "-32768";
static const char *strInt32s = "-2147483647";
static const char *strInt64s = "-9223372036854775807";
static const char *strInt8u = "255";
static const char *strInt16u = "65535";
static const char *strInt32u = "4294967295";
static const char *strInt64u = "18446744073709551615";
static size_t parsedSize;
BH_BENCH_TEST(StringFromDouble)
{
while (BH_BenchIter(state))
{
int result;
result = BH_StringFromDouble(buffer, BUF_SIZE, testDouble, 'f', 6, &actual);
BH_BenchDoNotOptimize(result);
BH_BenchDoNotOptimize(buffer);
BH_BenchDoNotOptimize(actual);
}
}
BH_BENCH_TEST(StringFromInt8s)
{
while (BH_BenchIter(state))
{
int result;
result = BH_StringFromInt8s(buffer, BUF_SIZE, testInt8s, 10, &actual);
BH_BenchDoNotOptimize(result);
BH_BenchDoNotOptimize(buffer);
BH_BenchDoNotOptimize(actual);
}
}
BH_BENCH_TEST(StringFromInt16s)
{
while (BH_BenchIter(state))
{
int result;
result = BH_StringFromInt16s(buffer, BUF_SIZE, testInt16s, 10, &actual);
BH_BenchDoNotOptimize(result);
BH_BenchDoNotOptimize(buffer);
BH_BenchDoNotOptimize(actual);
}
}
BH_BENCH_TEST(StringFromInt32s)
{
while (BH_BenchIter(state))
{
int result;
result = BH_StringFromInt32s(buffer, BUF_SIZE, testInt32s, 10, &actual);
BH_BenchDoNotOptimize(result);
BH_BenchDoNotOptimize(buffer);
BH_BenchDoNotOptimize(actual);
}
}
BH_BENCH_TEST(StringFromInt64s)
{
while (BH_BenchIter(state))
{
int result;
result = BH_StringFromInt64s(buffer, BUF_SIZE, testInt64s, 10, &actual);
BH_BenchDoNotOptimize(result);
BH_BenchDoNotOptimize(buffer);
BH_BenchDoNotOptimize(actual);
}
}
BH_BENCH_TEST(StringFromInt8u)
{
while (BH_BenchIter(state))
{
int result;
result = BH_StringFromInt8u(buffer, BUF_SIZE, testInt8u, 10, &actual);
BH_BenchDoNotOptimize(result);
BH_BenchDoNotOptimize(buffer);
BH_BenchDoNotOptimize(actual);
}
}
BH_BENCH_TEST(StringFromInt16u)
{
while (BH_BenchIter(state))
{
int result;
result = BH_StringFromInt16u(buffer, BUF_SIZE, testInt16u, 10, &actual);
BH_BenchDoNotOptimize(result);
BH_BenchDoNotOptimize(buffer);
BH_BenchDoNotOptimize(actual);
}
}
BH_BENCH_TEST(StringFromInt32u)
{
while (BH_BenchIter(state))
{
int result;
result = BH_StringFromInt32u(buffer, BUF_SIZE, testInt32u, 10, &actual);
BH_BenchDoNotOptimize(result);
BH_BenchDoNotOptimize(buffer);
BH_BenchDoNotOptimize(actual);
}
}
BH_BENCH_TEST(StringFromInt64u)
{
while (BH_BenchIter(state))
{
int result;
result = BH_StringFromInt64u(buffer, BUF_SIZE, testInt64u, 10, &actual);
BH_BenchDoNotOptimize(result);
BH_BenchDoNotOptimize(buffer);
BH_BenchDoNotOptimize(actual);
}
}
BH_BENCH_TEST(StringToDouble)
{
while (BH_BenchIter(state))
{
double result;
parsedSize = 0;
result = BH_StringToDouble(strDouble, &parsedSize);
BH_BenchDoNotOptimize(result);
BH_BenchDoNotOptimize(parsedSize);
}
}
BH_BENCH_TEST(StringToInt8s)
{
while (BH_BenchIter(state))
{
int8_t result;
parsedSize = 0;
result = BH_StringToInt8s(strInt8s, &parsedSize, 10);
BH_BenchDoNotOptimize(result);
BH_BenchDoNotOptimize(parsedSize);
}
}
BH_BENCH_TEST(StringToInt16s)
{
while (BH_BenchIter(state))
{
int16_t result;
parsedSize = 0;
result = BH_StringToInt16s(strInt16s, &parsedSize, 10);
BH_BenchDoNotOptimize(result);
BH_BenchDoNotOptimize(parsedSize);
}
}
BH_BENCH_TEST(StringToInt32s)
{
while (BH_BenchIter(state))
{
int32_t result;
parsedSize = 0;
result = BH_StringToInt32s(strInt32s, &parsedSize, 10);
BH_BenchDoNotOptimize(result);
BH_BenchDoNotOptimize(parsedSize);
}
}
BH_BENCH_TEST(StringToInt64s)
{
while (BH_BenchIter(state))
{
int64_t result;
parsedSize = 0;
result = BH_StringToInt64s(strInt64s, &parsedSize, 10);
BH_BenchDoNotOptimize(result);
BH_BenchDoNotOptimize(parsedSize);
}
}
BH_BENCH_TEST(StringToInt8u)
{
while (BH_BenchIter(state))
{
uint8_t result;
parsedSize = 0;
result = BH_StringToInt8u(strInt8u, &parsedSize, 10);
BH_BenchDoNotOptimize(result);
BH_BenchDoNotOptimize(parsedSize);
}
}
BH_BENCH_TEST(StringToInt16u)
{
while (BH_BenchIter(state))
{
uint16_t result;
parsedSize = 0;
result = BH_StringToInt16u(strInt16u, &parsedSize, 10);
BH_BenchDoNotOptimize(result);
BH_BenchDoNotOptimize(parsedSize);
}
}
BH_BENCH_TEST(StringToInt32u)
{
while (BH_BenchIter(state))
{
uint32_t result;
parsedSize = 0;
result = BH_StringToInt32u(strInt32u, &parsedSize, 10);
BH_BenchDoNotOptimize(result);
BH_BenchDoNotOptimize(parsedSize);
}
}
BH_BENCH_TEST(StringToInt64u)
{
while (BH_BenchIter(state))
{
uint64_t result;
parsedSize = 0;
result = BH_StringToInt64u(strInt64u, &parsedSize, 10);
BH_BenchDoNotOptimize(result);
BH_BenchDoNotOptimize(parsedSize);
}
}
int main(void)
{
BH_BENCH_ADD(StringFromDouble);
BH_BENCH_ADD(StringFromInt8s);
BH_BENCH_ADD(StringFromInt16s);
BH_BENCH_ADD(StringFromInt32s);
BH_BENCH_ADD(StringFromInt64s);
BH_BENCH_ADD(StringFromInt8u);
BH_BENCH_ADD(StringFromInt16u);
BH_BENCH_ADD(StringFromInt32u);
BH_BENCH_ADD(StringFromInt64u);
BH_BENCH_ADD(StringToDouble);
BH_BENCH_ADD(StringToInt8s);
BH_BENCH_ADD(StringToInt16s);
BH_BENCH_ADD(StringToInt32s);
BH_BENCH_ADD(StringToInt64s);
BH_BENCH_ADD(StringToInt8u);
BH_BENCH_ADD(StringToInt16u);
BH_BENCH_ADD(StringToInt32u);
BH_BENCH_ADD(StringToInt64u);
return BH_BenchRun();
}

View File

@@ -1,5 +1,5 @@
#include "BH/Bench.h" #include <BH/Bench.h>
#include "BH/Math/Vec2f.h" #include <BH/Math/Vec2f.h>
static float vecA[2] = {1.0f, 2.0f}; static float vecA[2] = {1.0f, 2.0f};

View File

@@ -1,5 +1,5 @@
#include "BH/Bench.h" #include <BH/Bench.h>
#include "BH/Math/Vec2i.h" #include <BH/Math/Vec2i.h>
static int vecA[2] = {5, -3}; static int vecA[2] = {5, -3};

View File

@@ -1,5 +1,5 @@
#include "BH/Bench.h" #include <BH/Bench.h>
#include "BH/Math/Vec3f.h" #include <BH/Math/Vec3f.h>
static float vecA[3] = {1.0f, 2.0f, 3.0f}; static float vecA[3] = {1.0f, 2.0f, 3.0f};

View File

@@ -1,5 +1,5 @@
#include "BH/Bench.h" #include <BH/Bench.h>
#include "BH/Math/Vec3i.h" #include <BH/Math/Vec3i.h>
static int vecA[3] = {1, 2, 3}; static int vecA[3] = {1, 2, 3};

View File

@@ -1,5 +1,5 @@
#include "BH/Bench.h" #include <BH/Bench.h>
#include "BH/Math/Vec4f.h" #include <BH/Math/Vec4f.h>
static float vecA[4] = {1.0f, 2.0f, 3.0f, 4.0f}; static float vecA[4] = {1.0f, 2.0f, 3.0f, 4.0f};

View File

@@ -1,5 +1,5 @@
#include "BH/Bench.h" #include <BH/Bench.h>
#include "BH/Math/Vec4i.h" #include <BH/Math/Vec4i.h>
static int vecA[4] = {1, 2, 3, 4}; static int vecA[4] = {1, 2, 3, 4};