From 1cf4bcc883a4ff0fd7ec4e04d4a80ae0c593a513 Mon Sep 17 00:00:00 2001 From: not-matthias Date: Thu, 1 Oct 2026 16:59:28 +0200 Subject: [PATCH] perf(runner-shared): buffer the decompressed memtrack event stream `MemtrackArtifact::decode_streamed` handed the zstd decoder straight to rmp_serde, which reads 1 to 8 bytes per call, so every small read went through zstd's stream API. Put a `BufReader` between the two. On a large memtrack artifact, decoding all events drops from 21-33 s to 11-21 s, with no change in peak memory. Refs COD-3704 --- crates/runner-shared/src/artifacts/memtrack/mod.rs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/crates/runner-shared/src/artifacts/memtrack/mod.rs b/crates/runner-shared/src/artifacts/memtrack/mod.rs index 7560ec9c..226d5750 100644 --- a/crates/runner-shared/src/artifacts/memtrack/mod.rs +++ b/crates/runner-shared/src/artifacts/memtrack/mod.rs @@ -24,12 +24,15 @@ impl super::ArtifactExt for MemtrackArtifact { } impl MemtrackArtifact { + /// The msgpack decoder reads a few bytes per call, so the decompressed + /// stream is buffered rather than read straight from the zstd decoder. + #[allow(clippy::type_complexity)] pub fn decode_streamed( reader: R, - ) -> anyhow::Result>>> { + ) -> anyhow::Result>>>> { let decoder = zstd::Decoder::new(reader)?; Ok(MemtrackEventStream { - deserializer: rmp_serde::Deserializer::new(decoder), + deserializer: rmp_serde::Deserializer::new(BufReader::new(decoder)), }) }