From d8b91aa948d2ca2c46ca0e14bcbdbf77e5f81b5f Mon Sep 17 00:00:00 2001 From: James M Snell Date: Tue, 28 Oct 2025 17:22:21 -0700 Subject: [PATCH] Some of the benchmark updates from the headers change --- src/workerd/tests/bench-api-headers.c++ | 44 +++++++++++++++++++++++++ src/workerd/tests/bench-response.c++ | 6 ++-- 2 files changed, 48 insertions(+), 2 deletions(-) diff --git a/src/workerd/tests/bench-api-headers.c++ b/src/workerd/tests/bench-api-headers.c++ index e76d35a665a..66a4f0642be 100644 --- a/src/workerd/tests/bench-api-headers.c++ +++ b/src/workerd/tests/bench-api-headers.c++ @@ -14,6 +14,12 @@ namespace { struct ApiHeaders: public benchmark::Fixture { virtual ~ApiHeaders() noexcept(true) {} + struct Header { + bool append; + kj::StringPtr name; + kj::StringPtr value; + }; + void SetUp(benchmark::State& state) noexcept(true) override { fixture = kj::heap(); @@ -45,6 +51,22 @@ struct ApiHeaders: public benchmark::Fixture { kj::Own fixture; kj::Own table; kj::Own kjHeaders; + Header kHeaders[13] = {Header{false, "Host"_kj, "example.com"_kj}, + Header{false, "User-Agent"_kj, + "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"_kj}, + Header{false, "Accept"_kj, + "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"_kj}, + Header{false, "Accept-Language"_kj, "en-US,en;q=0.9"_kj}, + Header{false, "Accept-Encoding"_kj, "gzip, deflate, br"_kj}, + Header{false, "Content-Type"_kj, "application/json; charset=utf-8"_kj}, + Header{false, "Authorization"_kj, + "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0"_kj}, + Header{false, "Cache-Control"_kj, "no-cache, no-store, must-revalidate"_kj}, + Header{false, "Content-Length"_kj, "1234"_kj}, + Header{false, "Referer"_kj, "https://www.example.com/page?query=value&other=param"_kj}, + Header{false, "X-Forwarded-For"_kj, "203.0.113.1, 198.51.100.17"_kj}, + Header{true, "Set-Cookie"_kj, "new_session=token123; Path=/; Secure; HttpOnly"_kj}, + Header{true, "Set-Cookie"_kj, "new_session=token124; Path=/abc; Secure; HttpOnly"_kj}}; }; // initialization performs a lot of copying, benchmark it @@ -61,5 +83,27 @@ BENCHMARK_F(ApiHeaders, constructor)(benchmark::State& state) { }); } +BENCHMARK_F(ApiHeaders, set_append)(benchmark::State& state) { + fixture->runInIoContext([&](const TestFixture::Environment& env) { + auto& js = env.js; + for (auto _: state) { + for (size_t i = 0; i < 1000; ++i) { + auto headers = js.alloc(); + // Set common headers with various representative lengths + for (int n = 0; n < 13; n++) { + auto& h = kHeaders[n]; + if (h.append) { + headers->append( + env.js, jsg::ByteString(kj::str(h.name)), jsg::ByteString(kj::str(h.value))); + } else { + headers->set( + env.js, jsg::ByteString(kj::str(h.name)), jsg::ByteString(kj::str(h.value))); + } + } + benchmark::DoNotOptimize(i); + } + } + }); +} } // namespace } // namespace workerd diff --git a/src/workerd/tests/bench-response.c++ b/src/workerd/tests/bench-response.c++ index 0123e4578d7..e53d23202cf 100644 --- a/src/workerd/tests/bench-response.c++ +++ b/src/workerd/tests/bench-response.c++ @@ -88,9 +88,11 @@ BENCHMARK_F(Response, arrayBufferBody)(benchmark::State& state) { BENCHMARK_F(Response, jsonResponse)(benchmark::State& state) { fixture->runInIoContext([&](const TestFixture::Environment& env) { auto& js = env.js; + // Prepare object to serialize. Do this outside the loop to avoid measuring its repeated + // construction cost. What we want to measure is just the cost of the api::Response::json_ call. + auto obj = js.obj(); + obj.set(js, "key"_kj, js.str("value"_kj)); for (auto _: state) { - auto obj = js.obj(); - obj.set(js, js.str("key"_kj), js.str("value"_kj)); benchmark::DoNotOptimize(api::Response::json_(js, obj, kj::none)); } });