diff options
-rw-r--r-- | Cargo.lock | 21 | ||||
-rw-r--r-- | bench_util/Cargo.toml | 8 | ||||
-rw-r--r-- | bench_util/benches/op_baseline.rs | 47 | ||||
-rw-r--r-- | core/Cargo.toml | 5 | ||||
-rw-r--r-- | core/benches/op_baseline.rs | 88 | ||||
-rw-r--r-- | extensions/url/Cargo.toml | 2 | ||||
-rw-r--r-- | extensions/url/benches/url_ops.rs | 37 |
7 files changed, 79 insertions, 129 deletions
diff --git a/Cargo.lock b/Cargo.lock index b82c58ffa..70eaa1004 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -194,15 +194,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" [[package]] -name = "bench_util" -version = "0.0.0" -dependencies = [ - "bencher", - "deno_core", - "tokio", -] - -[[package]] name = "bencher" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -592,6 +583,15 @@ dependencies = [ ] [[package]] +name = "deno_bench_util" +version = "0.1.0" +dependencies = [ + "bencher", + "deno_core", + "tokio", +] + +[[package]] name = "deno_console" version = "0.7.0" dependencies = [ @@ -603,7 +603,6 @@ name = "deno_core" version = "0.88.0" dependencies = [ "anyhow", - "bencher", "futures", "indexmap", "lazy_static", @@ -747,7 +746,7 @@ dependencies = [ name = "deno_url" version = "0.7.0" dependencies = [ - "bencher", + "deno_bench_util", "deno_core", "idna", "percent-encoding", diff --git a/bench_util/Cargo.toml b/bench_util/Cargo.toml index f3e1140c8..80886d818 100644 --- a/bench_util/Cargo.toml +++ b/bench_util/Cargo.toml @@ -1,7 +1,7 @@ # Copyright 2018-2021 the Deno authors. All rights reserved. MIT license. [package] -name = "bench_util" -version = "0.0.0" +name = "deno_bench_util" +version = "0.1.0" authors = ["the Deno authors"] edition = "2018" description = "Bench and profiling utilities for deno crates" @@ -16,3 +16,7 @@ publish = false bencher = "0.1" deno_core = { version = "0.88.0", path = "../core" } tokio = { version = "1.6.0", features = ["full"] } + +[[bench]] +name = "op_baseline" +harness = false diff --git a/bench_util/benches/op_baseline.rs b/bench_util/benches/op_baseline.rs new file mode 100644 index 000000000..ecce90bec --- /dev/null +++ b/bench_util/benches/op_baseline.rs @@ -0,0 +1,47 @@ +use deno_bench_util::bench_or_profile; +use deno_bench_util::bencher::{benchmark_group, Bencher}; +use deno_bench_util::{bench_js_async, bench_js_sync}; + +use deno_core::error::AnyError; +use deno_core::op_async; +use deno_core::op_sync; +use deno_core::serialize_op_result; +use deno_core::JsRuntime; +use deno_core::Op; +use deno_core::OpState; + +use std::cell::RefCell; +use std::rc::Rc; + +fn setup(runtime: &mut JsRuntime) { + runtime.register_op("pi_json", op_sync(|_, _: (), _: ()| Ok(314159))); + runtime.register_op("pi_async", op_async(op_pi_async)); + runtime.register_op("nop", |state, _| { + Op::Sync(serialize_op_result(Ok(9), state)) + }); + runtime.sync_ops_cache(); +} + +// this is a function since async closures aren't stable +async fn op_pi_async( + _: Rc<RefCell<OpState>>, + _: (), + _: (), +) -> Result<i64, AnyError> { + Ok(314159) +} + +fn bench_op_pi_json(b: &mut Bencher) { + bench_js_sync(b, r#"Deno.core.opSync("pi_json", null);"#, setup); +} + +fn bench_op_nop(b: &mut Bencher) { + bench_js_sync(b, r#"Deno.core.opSync("nop", null, null, null);"#, setup); +} + +fn bench_op_async(b: &mut Bencher) { + bench_js_async(b, r#"Deno.core.opAsync("pi_async", null);"#, setup); +} + +benchmark_group!(benches, bench_op_pi_json, bench_op_nop, bench_op_async); +bench_or_profile!(benches); diff --git a/core/Cargo.toml b/core/Cargo.toml index 0f2968e61..6ad8ea67e 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -34,8 +34,3 @@ path = "examples/http_bench_json_ops.rs" # These dependencies are only used for the 'http_bench_*_ops' examples. [dev-dependencies] tokio = { version = "1.6.0", features = ["full"] } -bencher = "0.1" - -[[bench]] -name = "op_baseline" -harness = false diff --git a/core/benches/op_baseline.rs b/core/benches/op_baseline.rs deleted file mode 100644 index ecac4ca26..000000000 --- a/core/benches/op_baseline.rs +++ /dev/null @@ -1,88 +0,0 @@ -use bencher::{benchmark_group, benchmark_main, Bencher}; - -use deno_core::error::AnyError; -use deno_core::op_async; -use deno_core::op_sync; -use deno_core::serialize_op_result; -use deno_core::v8; -use deno_core::JsRuntime; -use deno_core::Op; -use deno_core::OpState; - -use std::cell::RefCell; -use std::rc::Rc; - -fn create_js_runtime() -> JsRuntime { - let mut runtime = JsRuntime::new(Default::default()); - runtime.register_op("pi_json", op_sync(|_, _: (), _: ()| Ok(314159))); - runtime.register_op("pi_async", op_async(op_pi_async)); - runtime.register_op("nop", |state, _| { - Op::Sync(serialize_op_result(Ok(9), state)) - }); - runtime.sync_ops_cache(); - - runtime -} - -// this is a function since async closures aren't stable -async fn op_pi_async( - _: Rc<RefCell<OpState>>, - _: (), - _: (), -) -> Result<i64, AnyError> { - Ok(314159) -} - -pub fn bench_runtime_js(b: &mut Bencher, src: &str) { - let mut runtime = create_js_runtime(); - let scope = &mut runtime.handle_scope(); - let code = v8::String::new(scope, src).unwrap(); - let script = v8::Script::compile(scope, code, None).unwrap(); - b.iter(|| { - script.run(scope).unwrap(); - }); -} - -pub fn bench_runtime_js_async(b: &mut Bencher, src: &str) { - let mut runtime = create_js_runtime(); - let tokio_runtime = tokio::runtime::Builder::new_current_thread() - .enable_all() - .build() - .unwrap(); - - b.iter(|| { - runtime.execute("inner_loop", src).unwrap(); - let future = runtime.run_event_loop(); - tokio_runtime.block_on(future).unwrap(); - }); -} - -fn bench_op_pi_json(b: &mut Bencher) { - bench_runtime_js( - b, - r#"for(let i=0; i < 1e3; i++) { - Deno.core.opSync("pi_json", null); - }"#, - ); -} - -fn bench_op_nop(b: &mut Bencher) { - bench_runtime_js( - b, - r#"for(let i=0; i < 1e3; i++) { - Deno.core.opSync("nop", null, null, null); - }"#, - ); -} - -fn bench_op_async(b: &mut Bencher) { - bench_runtime_js_async( - b, - r#"for(let i=0; i < 1e3; i++) { - Deno.core.opAsync("pi_async", null); - }"#, - ); -} - -benchmark_group!(benches, bench_op_pi_json, bench_op_nop, bench_op_async); -benchmark_main!(benches); diff --git a/extensions/url/Cargo.toml b/extensions/url/Cargo.toml index 70a880e0d..19d8a113d 100644 --- a/extensions/url/Cargo.toml +++ b/extensions/url/Cargo.toml @@ -20,7 +20,7 @@ percent-encoding = "2.1.0" serde = { version = "1.0.125", features = ["derive"] } [dev-dependencies] -bencher = "0.1" +deno_bench_util = { version = "0.1.0", path = "../../bench_util" } [[bench]] name = "url_ops" diff --git a/extensions/url/benches/url_ops.rs b/extensions/url/benches/url_ops.rs index 8b3cf2705..b901939e0 100644 --- a/extensions/url/benches/url_ops.rs +++ b/extensions/url/benches/url_ops.rs @@ -1,35 +1,28 @@ -use bencher::{benchmark_group, benchmark_main, Bencher}; +use deno_bench_util::bench_js_sync; +use deno_bench_util::bench_or_profile; +use deno_bench_util::bencher::{benchmark_group, Bencher}; -use deno_core::v8; use deno_core::JsRuntime; -use deno_core::RuntimeOptions; -fn create_js_runtime() -> JsRuntime { - let mut runtime = JsRuntime::new(RuntimeOptions { - extensions: vec![deno_url::init()], - ..Default::default() - }); +fn setup(runtime: &mut JsRuntime) { + // TODO(@AaronO): support caller provided extensions in deno_bench_util + let mut ext = deno_url::init(); + + for (name, op_fn) in ext.init_ops().unwrap() { + runtime.register_op(name, op_fn); + } + for (filename, src) in ext.init_js() { + runtime.execute(filename, src).unwrap(); + } runtime .execute("setup", "const { URL } = globalThis.__bootstrap.url;") .unwrap(); - - runtime -} - -pub fn bench_runtime_js(b: &mut Bencher, src: &str) { - let mut runtime = create_js_runtime(); - let scope = &mut runtime.handle_scope(); - let code = v8::String::new(scope, src).unwrap(); - let script = v8::Script::compile(scope, code, None).unwrap(); - b.iter(|| { - script.run(scope).unwrap(); - }); } fn bench_url_parse(b: &mut Bencher) { - bench_runtime_js(b, r#"new URL(`http://www.google.com/`);"#); + bench_js_sync(b, r#"new URL(`http://www.google.com/`);"#, setup); } benchmark_group!(benches, bench_url_parse,); -benchmark_main!(benches); +bench_or_profile!(benches); |