From 848351dce768412a3042fe8b62877fa641c47bb1 Mon Sep 17 00:00:00 2001 From: Mike Aizatsky Date: Tue, 29 Aug 2023 13:48:04 -0700 Subject: [PATCH] [nfc] api headers benchmark --- src/workerd/tests/BUILD.bazel | 12 +++- src/workerd/tests/bench-api-headers.c++ | 61 +++++++++++++++++++ ...bench-headers.c++ => bench-kj-headers.c++} | 6 +- 3 files changed, 74 insertions(+), 5 deletions(-) create mode 100644 src/workerd/tests/bench-api-headers.c++ rename src/workerd/tests/{bench-headers.c++ => bench-kj-headers.c++} (90%) diff --git a/src/workerd/tests/BUILD.bazel b/src/workerd/tests/BUILD.bazel index b950dca50c5..b6708df3ba1 100644 --- a/src/workerd/tests/BUILD.bazel +++ b/src/workerd/tests/BUILD.bazel @@ -48,13 +48,21 @@ wd_cc_benchmark( ) wd_cc_benchmark( - name = "bench-headers", - srcs = ["bench-headers.c++"], + name = "bench-kj-headers", + srcs = ["bench-kj-headers.c++"], deps = [ "@capnp-cpp//src/kj/compat:kj-http", ], ) +wd_cc_benchmark( + name = "bench-api-headers", + srcs = ["bench-api-headers.c++"], + deps = [ + ":test-fixture", + ], +) + wd_cc_benchmark( name = "bench-global-scope", srcs = ["bench-global-scope.c++"], diff --git a/src/workerd/tests/bench-api-headers.c++ b/src/workerd/tests/bench-api-headers.c++ new file mode 100644 index 00000000000..5b1e9256785 --- /dev/null +++ b/src/workerd/tests/bench-api-headers.c++ @@ -0,0 +1,61 @@ +// Copyright (c) 2023 Cloudflare, Inc. +// Licensed under the Apache 2.0 license found in the LICENSE file or at: +// https://opensource.org/licenses/Apache-2.0 + +#include +#include +#include + +// A benchmark for js Header class. + +namespace workerd { +namespace { + +struct ApiHeaders: public benchmark::Fixture { + virtual ~ApiHeaders() noexcept(true) {} + + + void SetUp(benchmark::State& state) noexcept(true) override { + fixture = kj::heap(); + + kj::HttpHeaderTable::Builder builder; + builder.add("Host"); + builder.add("Accept"); + builder.add("Content-Type"); + builder.add("Last-Modified"); + table = builder.build(); + kjHeaders = kj::heap(*table); + auto in = kj::heapString( + "GET /favicon.ico HTTP/1.1\r\n" + "Host: 0.0.0.0=5000\r\n" + "User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9) Gecko/2008061015 Firefox/3.0\r\n" + "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n" + "Accept-Language: en-us,en;q=0.5\r\n" + "Accept-Encoding: gzip,deflate\r\n" + "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n" + "Keep-Alive: 300\r\n" + "Connection: keep-alive\r\n" + "\r\n"); + KJ_EXPECT(kjHeaders->tryParseRequest(in.asArray()).is()); + } + + void TearDown(benchmark::State& state) noexcept(true) override { + fixture = nullptr; + } + + kj::Own fixture; + kj::Own table; + kj::Own kjHeaders; +}; + +// initialization performs a lot of copying, benchmark it +BENCHMARK_F(ApiHeaders, constructor)(benchmark::State& state) { + fixture->runInIoContext([&](const TestFixture::Environment& env) { + for (auto _ : state) { + auto jsHeaders = jsg::alloc(*kjHeaders, api::Headers::Guard::REQUEST); + } + }); +} + +} // namespace +} // namespace workerd diff --git a/src/workerd/tests/bench-headers.c++ b/src/workerd/tests/bench-kj-headers.c++ similarity index 90% rename from src/workerd/tests/bench-headers.c++ rename to src/workerd/tests/bench-kj-headers.c++ index c617f1e4fd4..c30c8a08ebf 100644 --- a/src/workerd/tests/bench-headers.c++ +++ b/src/workerd/tests/bench-kj-headers.c++ @@ -8,8 +8,8 @@ namespace workerd { namespace { -struct Fixture: public benchmark::Fixture { - virtual ~Fixture() noexcept(true) {} +struct KjHeaders: public benchmark::Fixture { + virtual ~KjHeaders() noexcept(true) {} void SetUp(benchmark::State& state) noexcept(true) override { kj::HttpHeaderTable::Builder builder; @@ -23,7 +23,7 @@ struct Fixture: public benchmark::Fixture { kj::Own table; }; -BENCHMARK_F(Fixture, Parse)(benchmark::State& state) { +BENCHMARK_F(KjHeaders, Parse)(benchmark::State& state) { for (auto _ : state) { kj::HttpHeaders headers(*table);