diff --git a/barretenberg/cpp/src/barretenberg/numeric/random/engine.cpp b/barretenberg/cpp/src/barretenberg/numeric/random/engine.cpp index 6d30a12a75e6..a1eb6a6d259b 100644 --- a/barretenberg/cpp/src/barretenberg/numeric/random/engine.cpp +++ b/barretenberg/cpp/src/barretenberg/numeric/random/engine.cpp @@ -9,6 +9,7 @@ #include #include #include +#include #include #if defined(__APPLE__) #include @@ -44,8 +45,9 @@ constexpr size_t RANDOM_BUFFER_SIZE = 1UL << 20; #endif struct RandomBufferWrapper { - // Buffer with randomness sampled from a CSPRNG - uint8_t buffer[RANDOM_BUFFER_SIZE]; + // Buffer with randomness sampled from a CSPRNG (heap-allocated on first use to avoid + // bloating TLS — a 1 MiB inline array adds ~0.6 ms per thread creation) + std::unique_ptr buffer; // Offset into the unused part of the buffer ssize_t offset = -1; }; @@ -67,8 +69,11 @@ template std::array(random_buffer_wrapper.offset) + random_data_buffer_size) > RANDOM_BUFFER_SIZE) { + if (!random_buffer_wrapper.buffer) { + random_buffer_wrapper.buffer = std::make_unique(RANDOM_BUFFER_SIZE); + } size_t bytes_left = RANDOM_BUFFER_SIZE; - uint8_t* current_offset = random_buffer_wrapper.buffer; + uint8_t* current_offset = random_buffer_wrapper.buffer.get(); // Sample until we fill the buffer while (bytes_left != 0) { #if defined(__wasm__) || defined(__APPLE__) @@ -97,7 +102,7 @@ template std::array(random_data_buffer_size); return random_data; }