From 8f321a8a39b0926e00ff9e76c44bc687f3a3c8da Mon Sep 17 00:00:00 2001 From: Divy Srivastava Date: Sun, 15 Jan 2023 05:36:12 -0800 Subject: [PATCH] chore(ext/webidl): Add dictionary converter microbenchmark (#17435) This commits add a `webidl.createDictionaryConverter` converter microbenchmark. There are 2 PRs currently open that need a microbenchmark for webidl dictionary converter. See https://github.com/denoland/deno/pull/16594 and https://github.com/denoland/deno/pull/16407 Closes https://github.com/denoland/deno/issues/17436 --- Cargo.lock | 1 + ext/webidl/Cargo.toml | 7 +++++++ ext/webidl/benches/dict.js | 35 +++++++++++++++++++++++++++++++ ext/webidl/benches/dict.rs | 42 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 85 insertions(+) create mode 100644 ext/webidl/benches/dict.js create mode 100644 ext/webidl/benches/dict.rs diff --git a/Cargo.lock b/Cargo.lock index ecb760ca72..13fcd90201 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1284,6 +1284,7 @@ dependencies = [ name = "deno_webidl" version = "0.84.0" dependencies = [ + "deno_bench_util", "deno_core", ] diff --git a/ext/webidl/Cargo.toml b/ext/webidl/Cargo.toml index 744115aec5..e0a90ed4d4 100644 --- a/ext/webidl/Cargo.toml +++ b/ext/webidl/Cargo.toml @@ -15,3 +15,10 @@ path = "lib.rs" [dependencies] deno_core.workspace = true + +[dev-dependencies] +deno_bench_util.workspace = true + +[[bench]] +name = "dict" +harness = false diff --git a/ext/webidl/benches/dict.js b/ext/webidl/benches/dict.js new file mode 100644 index 0000000000..353a630eb9 --- /dev/null +++ b/ext/webidl/benches/dict.js @@ -0,0 +1,35 @@ +// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license. + +// deno-lint-ignore-file + +const { createDictionaryConverter, converters } = globalThis.__bootstrap.webidl; + +const TextDecodeOptions = createDictionaryConverter( + "TextDecodeOptions", + [ + { + key: "stream", + converter: converters.boolean, + defaultValue: false, + }, + ], +); + +// Sanity check +{ + const o = TextDecodeOptions(undefined); + if (o.stream !== false) { + throw new Error("Unexpected stream value"); + } +} + +function handwrittenConverter(V) { + const defaultValue = { stream: false }; + if (V === undefined || V === null) { + return defaultValue; + } + if (V.stream !== undefined) { + defaultValue.stream = !!V.stream; + } + return defaultValue; +} diff --git a/ext/webidl/benches/dict.rs b/ext/webidl/benches/dict.rs new file mode 100644 index 0000000000..e7df8af62d --- /dev/null +++ b/ext/webidl/benches/dict.rs @@ -0,0 +1,42 @@ +// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license. + +use deno_bench_util::bench_js_sync; +use deno_bench_util::bench_or_profile; +use deno_bench_util::bencher::benchmark_group; +use deno_bench_util::bencher::Bencher; + +use deno_core::Extension; + +fn setup() -> Vec { + vec![ + deno_webidl::init(), + Extension::builder("deno_webidl_bench") + .js(vec![("setup", include_str!("dict.js"))]) + .build(), + ] +} + +fn converter_undefined(b: &mut Bencher) { + bench_js_sync(b, r#"TextDecodeOptions(undefined);"#, setup); +} + +fn handwritten_baseline_undefined(b: &mut Bencher) { + bench_js_sync(b, r#"handwrittenConverter(undefined)"#, setup); +} + +fn converter_object(b: &mut Bencher) { + bench_js_sync(b, r#"TextDecodeOptions({});"#, setup); +} + +fn handwritten_baseline_object(b: &mut Bencher) { + bench_js_sync(b, r#"handwrittenConverter({})"#, setup); +} + +benchmark_group!( + benches, + converter_undefined, + handwritten_baseline_undefined, + converter_object, + handwritten_baseline_object, +); +bench_or_profile!(benches);