summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/main.cpp37
1 files changed, 33 insertions, 4 deletions
diff --git a/src/main.cpp b/src/main.cpp
index 020f46b..67d92e2 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -1,5 +1,9 @@
+#include <array>
#include <chrono>
#include <cstdint>
+#include <cstring>
+#include <errno.h>
+#include <fstream>
#include <print>
#include <random>
#include <string>
@@ -18,6 +22,25 @@ void parse_int(std::string_view arg, std::uint64_t &i) {
}
}
+std::uint64_t random_u64() {
+ std::ifstream ifstream{"/dev/random", std::ios::binary};
+
+ if (!ifstream.is_open()) {
+ throw std::runtime_error(
+ std::format("failed to open /dev/random: {}", std::strerror(errno)));
+ }
+
+ std::array<char, 8> buff;
+
+ ifstream.read(buff.data(), 8);
+
+ std::uint64_t i;
+
+ std::memcpy(&i, buff.data(), 8);
+
+ return i;
+}
+
int main(int argc, char **argv) {
if (argc < 3) {
std::println(stderr, "usage: bench <database> <limit> [seed]");
@@ -27,6 +50,8 @@ int main(int argc, char **argv) {
auto *path = argv[1];
auto *limit = argv[2];
+ std::println(stderr, "starting benchmark");
+
std::uint64_t seed;
if (argc > 3) {
try {
@@ -36,12 +61,15 @@ int main(int argc, char **argv) {
return 1;
}
} else {
- seed = std::chrono::system_clock::now().time_since_epoch().count();
+ try {
+ seed = random_u64();
+ } catch (std::exception &e) {
+ std::println(stderr, "{}", e.what());
+ return 1;
+ }
}
- std::default_random_engine rng{seed};
-
- std::println(stderr, "starting benchmark");
+ std::println(stderr, "using random seed: {}", seed);
boost::sqlite::connection connection{path};
@@ -54,6 +82,7 @@ int main(int argc, char **argv) {
keys.push_back(key);
}
+ std::default_random_engine rng{seed};
std::shuffle(keys.begin(), keys.end(), rng);
std::println(stderr, "slurped {} keys into memory", keys.size());