From ae652cab3cf0541173b31273bcec5746a9a81e68 Mon Sep 17 00:00:00 2001 From: Rutger Broekhoff Date: Fri, 11 Sep 2026 17:22:44 +0200 Subject: Speed improvements --- server/src/trace.cpp | 77 ++++++++++++++++++++++++++++++++++------------------ 1 file changed, 51 insertions(+), 26 deletions(-) (limited to 'server/src/trace.cpp') diff --git a/server/src/trace.cpp b/server/src/trace.cpp index e7c00d0..f2935a9 100644 --- a/server/src/trace.cpp +++ b/server/src/trace.cpp @@ -10,6 +10,26 @@ import :trace; namespace routemon::trace { +class psrng +{ + mutable std::default_random_engine e_ = {}; + mutable std::uniform_int_distribution distr_ = {}; + mutable std::mutex mut_ = {}; + +public: + auto next() const -> std::uint64_t + { + auto lock = std::lock_guard{mut_}; + return distr_(e_); + } + + static auto instance() -> psrng const& + { + static auto const inst = psrng{}; + return inst; + } +}; + uuid7::uuid7() { namespace chrono = std::chrono; @@ -23,46 +43,51 @@ uuid7::uuid7() if (std::countl_zero(unix_time_ms) < 16) throw std::runtime_error{"system time too great"}; - auto rand = std::array{}; - int s = RAND_bytes(rand.data(), static_cast(rand.size())); - if (s != 1) - { - unsigned long e = ERR_get_error(); - throw std::runtime_error{std::format( - "failed to generate UUID(v7): {} ({}, code {})", - ERR_reason_error_string(e), ERR_lib_error_string(e), e)}; - } + auto const& rng = psrng::instance(); + auto const rand1 = rng.next(); + auto const rand2 = rng.next(); auto version = std::uint64_t{0b0111}; auto variant = std::uint64_t{0b10}; - hi_ |= unix_time_ms << 16; + hi_ = unix_time_ms << 16; hi_ |= version << 12; - hi_ |= std::uint64_t{rand[0]} << 4; - hi_ |= std::uint64_t{rand[1]}; - lo_ |= variant << 62; - lo_ |= std::uint64_t{rand[2]} << 54; - lo_ |= std::uint64_t{rand[3]} << 48; - lo_ |= std::uint64_t{rand[4]} << 40; - lo_ |= std::uint64_t{rand[5]} << 32; - lo_ |= std::uint64_t{rand[6]} << 24; - lo_ |= std::uint64_t{rand[7]} << 16; - lo_ |= std::uint64_t{rand[8]} << 8; - lo_ |= std::uint64_t{rand[9]}; + hi_ |= rand1 & 0x0000'0000'0000'0fff; + lo_ = variant << 62; + lo_ |= rand2 >> 2; } -auto uuid7::format(std::array& target) -> void +auto uuid7::format(std::span target) -> void { + auto hexnibs = + [](std::uint64_t v, std::span s) -> void + { + for (auto i = 0uz; i < n; i++) + { + static char const hextab[16] = { + '0', '1', '2', '3', '4', '5', '6', '7', + '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', + }; + s[i] = hextab[(v >> 4 * (n - 1 - i)) & 0xf]; + } + }; + auto p____hi_hi = (hi_ & 0xffff'ffff'0000'0000) >> 32; auto p_hi_lo_hi = (hi_ & 0x0000'0000'ffff'0000) >> 16; auto p_lo_lo_hi = (hi_ & 0x0000'0000'0000'ffff) >> 0; auto p____hi_lo = (lo_ & 0xffff'0000'0000'0000) >> 48; auto p____lo_lo = (lo_ & 0x0000'ffff'ffff'ffff) >> 0; - std::format_to( - target.begin(), "{:0>8x}-{:0>4x}-{:0>4x}-{:0>4x}-{:0>12x}", p____hi_hi, - p_hi_lo_hi, p_lo_lo_hi, p____hi_lo, p____lo_lo); - target.back() = '\0'; + hexnibs(p____hi_hi, target.subspan<0, 8>()); + target[8] = '-'; + hexnibs(p_hi_lo_hi, target.subspan<9, 4>()); + target[13] = '-'; + hexnibs(p_lo_lo_hi, target.subspan<14, 4>()); + target[18] = '-'; + hexnibs(p____hi_lo, target.subspan<19, 4>()); + target[23] = '-'; + hexnibs(p____lo_lo, target.subspan<24, 12>()); + target[36] = '\0'; } id::id() { uuid7{}.format(chars_); } -- cgit v1.3