summaryrefslogtreecommitdiffstats
path: root/benchmark
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2021-07-02 13:54:45 -0400
committerDavid Robillard <d@drobilla.net>2021-07-17 19:58:17 -0400
commit5942e985c6ac9b18090ec92b11aa8a586b6365c5 (patch)
treece66d68e863df9ecba01c16dfe1a5bc7100068f0 /benchmark
parentbc264ab6f58177124d49a72b4a808eb97fa2cb25 (diff)
downloadzix-5942e985c6ac9b18090ec92b11aa8a586b6365c5.tar.gz
zix-5942e985c6ac9b18090ec92b11aa8a586b6365c5.tar.bz2
zix-5942e985c6ac9b18090ec92b11aa8a586b6365c5.zip
Avoid use of rand()
Diffstat (limited to 'benchmark')
-rw-r--r--benchmark/.clang-tidy4
-rw-r--r--benchmark/dict_bench.c16
-rw-r--r--benchmark/tree_bench.c18
3 files changed, 14 insertions, 24 deletions
diff --git a/benchmark/.clang-tidy b/benchmark/.clang-tidy
index 06febc0..2c16e13 100644
--- a/benchmark/.clang-tidy
+++ b/benchmark/.clang-tidy
@@ -7,10 +7,6 @@ Checks: >
-bugprone-suspicious-string-compare,
-cert-dcl37-c,
-cert-dcl51-cpp,
- -cert-msc30-c,
- -cert-msc32-c,
- -cert-msc50-cpp,
- -cert-msc51-cpp,
-clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling,
-hicpp-multiway-paths-covered,
-llvm-header-guard,
diff --git a/benchmark/dict_bench.c b/benchmark/dict_bench.c
index 4a82a8f..4a77257 100644
--- a/benchmark/dict_bench.c
+++ b/benchmark/dict_bench.c
@@ -39,6 +39,16 @@ typedef struct {
size_t len;
} ZixChunk;
+/// Linear Congruential Generator for making random 64-bit integers
+static inline uint64_t
+lcg64(const uint64_t i)
+{
+ static const uint64_t a = 6364136223846793005ull;
+ static const uint64_t c = 1ull;
+
+ return (a * i) + c;
+}
+
static uint32_t
zix_chunk_hash(const ZixChunk* const chunk)
{
@@ -151,10 +161,9 @@ main(int argc, char** argv)
// Benchmark search
// GHashTable
- srand(seed);
struct timespec search_start = bench_start();
for (size_t i = 0; i < n; ++i) {
- const size_t index = rand() % n;
+ const size_t index = lcg64(seed + i) % n;
char* match = (char*)g_hash_table_lookup(hash, strings[index]);
if (strcmp(match, strings[index])) {
return test_fail("Bad match for `%s'\n", strings[index]);
@@ -163,10 +172,9 @@ main(int argc, char** argv)
fprintf(search_dat, "\t%lf", bench_end(&search_start));
// ZixHash
- srand(seed);
search_start = bench_start();
for (size_t i = 0; i < n; ++i) {
- const size_t index = rand() % n;
+ const size_t index = lcg64(seed + i) % n;
const ZixChunk key = {strings[index], lengths[index] + 1};
const ZixChunk* match = NULL;
if (!(match = (const ZixChunk*)zix_hash_find(zhash, &key))) {
diff --git a/benchmark/tree_bench.c b/benchmark/tree_bench.c
index bd274b1..9e399ba 100644
--- a/benchmark/tree_bench.c
+++ b/benchmark/tree_bench.c
@@ -17,6 +17,8 @@
#include "bench.h"
#include "warnings.h"
+#include "../test/test_data.h"
+
#include "zix/btree.h"
#include "zix/common.h"
#include "zix/tree.h"
@@ -35,22 +37,6 @@ ZIX_RESTORE_WARNINGS
// #define BENCH_SORTED_ARRAY 1
-// Return a pseudo-pseudo-pseudo-random-ish integer with no duplicates
-static size_t
-unique_rand(size_t i)
-{
- i ^= 0x5CA1AB1Eu; // Juggle bits to avoid linear clumps
-
- // Largest prime < 2^32 which satisfies (2^32 = 3 mod 4)
- static const size_t prime = 4294967291;
- if (i >= prime) {
- return i; // Values >= prime are mapped to themselves
- }
-
- const size_t residue = ((uint64_t)i * i) % prime;
- return (i <= prime / 2) ? residue : prime - residue;
-}
-
static int
int_cmp(const void* a, const void* b, const void* ZIX_UNUSED(user_data))
{