diff --git a/Cargo.lock b/Cargo.lock index b8ef47bda..5a79d4c96 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -433,6 +433,12 @@ dependencies = [ "syn 2.0.18", ] +[[package]] +name = "daachorse" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63b7ef7a4be509357f4804d0a22e830daddb48f19fd604e4ad32ddce04a94c36" + [[package]] name = "dashmap" version = "5.4.0" @@ -476,6 +482,12 @@ dependencies = [ "crypto-common", ] +[[package]] +name = "dunce" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56ce8c6da7551ec6c462cbaf3bfbc75131ebbfa1c944aeaa9dab51ca1c5f0c3b" + [[package]] name = "either" version = "1.8.1" @@ -838,6 +850,15 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "jsonc-parser" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b56a20e76235284255a09fcd1f45cf55d3c524ea657ebd3854735925c57743d" +dependencies = [ + "serde_json", +] + [[package]] name = "lazy_static" version = "1.4.0" @@ -919,6 +940,15 @@ dependencies = [ "serde", ] +[[package]] +name = "matchers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +dependencies = [ + "regex-automata", +] + [[package]] name = "memchr" version = "2.5.0" @@ -1042,6 +1072,36 @@ dependencies = [ "libloading", ] +[[package]] +name = "nodejs-resolver" +version = "0.0.88" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7259edee7a18be2bdc9802f3357044a964d6e0624030201849ed734b8901a23b" +dependencies = [ + "daachorse", + "dashmap", + "dunce", + "indexmap", + "jsonc-parser", + "once_cell", + "path-absolutize", + "rustc-hash", + "serde", + "serde_json", + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "nu-ansi-term" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +dependencies = [ + "overload", + "winapi", +] + [[package]] name = "num-bigint" version = "0.4.3" @@ -1103,6 +1163,12 @@ dependencies = [ "num-traits", ] +[[package]] +name = "overload" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" + [[package]] name = "owo-colors" version = "3.5.0" @@ -1394,6 +1460,9 @@ version = "0.0.0" dependencies = [ "criterion", "dashmap", + "jemallocator", + "mimalloc", + "nodejs-resolver", "serde", "serde_json", "static_assertions", @@ -1707,9 +1776,24 @@ checksum = "d0ab3ca65655bb1e41f2a8c8cd662eb4fb035e67c3f78da1d61dffe89d07300f" dependencies = [ "aho-corasick 1.0.2", "memchr", - "regex-syntax", + "regex-syntax 0.7.2", ] +[[package]] +name = "regex-automata" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" +dependencies = [ + "regex-syntax 0.6.29", +] + +[[package]] +name = "regex-syntax" +version = "0.6.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" + [[package]] name = "regex-syntax" version = "0.7.2" @@ -1880,6 +1964,7 @@ version = "1.0.96" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "057d394a50403bcac12672b2b18fb387ab6d289d957dab67dd201875391e52f1" dependencies = [ + "indexmap", "itoa", "ryu", "serde", @@ -1909,6 +1994,15 @@ dependencies = [ "digest", ] +[[package]] +name = "sharded-slab" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31" +dependencies = [ + "lazy_static", +] + [[package]] name = "similar" version = "2.2.1" @@ -2155,6 +2249,68 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "tracing" +version = "0.1.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" +dependencies = [ + "cfg-if", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.18", +] + +[[package]] +name = "tracing-core" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922" +dependencies = [ + "lazy_static", + "log", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30a651bc37f915e81f087d86e62a18eec5f79550c7faff886f7090b4ea757c77" +dependencies = [ + "matchers", + "nu-ansi-term", + "once_cell", + "regex", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", +] + [[package]] name = "typenum" version = "1.16.0" @@ -2260,6 +2416,12 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" +[[package]] +name = "valuable" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" + [[package]] name = "version_check" version = "0.9.4" diff --git a/crates/oxc_resolver/Cargo.toml b/crates/oxc_resolver/Cargo.toml index 1304341af..cc9116185 100644 --- a/crates/oxc_resolver/Cargo.toml +++ b/crates/oxc_resolver/Cargo.toml @@ -18,7 +18,14 @@ serde_json = { workspace = true } [dev-dependencies] static_assertions = { workspace = true } criterion = { workspace = true } -vfs = "0.9.0" +vfs = "0.9.0" # for testing with in memory file system +nodejs-resolver = "0.0.88" # for benchmark + +[target.'cfg(not(target_env = "msvc"))'.dev-dependencies] +jemallocator = { workspace = true } + +[target.'cfg(target_os = "windows")'.dev-dependencies] +mimalloc = { workspace = true } [[bench]] name = "resolver" diff --git a/crates/oxc_resolver/benches/resolver.rs b/crates/oxc_resolver/benches/resolver.rs index afd03cf8f..2852dd818 100644 --- a/crates/oxc_resolver/benches/resolver.rs +++ b/crates/oxc_resolver/benches/resolver.rs @@ -7,35 +7,64 @@ //! cargo bench --bench resolver -- --save-baseline pr //! critcmp //! ``` -use std::env; + +#[cfg(not(target_env = "msvc"))] +#[global_allocator] +static GLOBAL: jemallocator::Jemalloc = jemallocator::Jemalloc; + +#[cfg(target_os = "windows")] +#[global_allocator] +static GLOBAL: mimalloc::MiMalloc = mimalloc::MiMalloc; + +use std::{env, path::PathBuf}; use criterion::{criterion_group, criterion_main, BenchmarkId, Criterion}; -use oxc_resolver::Resolver; -fn criterion_benchmark(c: &mut Criterion) { +fn data() -> Vec<(PathBuf, &'static str)> { let cwd = env::current_dir().unwrap().join("tests/enhanced_resolve/"); - let resolver = Resolver::default(); - - let data = [ + vec![ (cwd.clone(), "./"), (cwd.clone(), "./lib/index"), (cwd.join("./test/fixtures/extensions"), "./foo"), (cwd.join("test/fixtures/extensions/module"), "module"), - ]; - - // Check path is valid - for (path, request) in &data { - assert!(resolver.resolve(path, request).is_ok(), "{path:?} {request}"); - } - - c.bench_with_input(BenchmarkId::new("resolve", ""), &data, |b, data| { - b.iter(|| { - for (path, request) in data { - _ = resolver.resolve(path, request); - } - }); - }); + ] } -criterion_group!(benches, criterion_benchmark); +fn resolver_benchmark(c: &mut Criterion) { + let data = data(); + + // bench nodejs_resolver + { + let resolver = nodejs_resolver::Resolver::new(nodejs_resolver::Options::default()); + // Check path is valid + for (path, request) in &data { + assert!(resolver.resolve(path, request).is_ok(), "{path:?} {request}"); + } + c.bench_with_input(BenchmarkId::new("nodejs_resolver", ""), &data, |b, data| { + b.iter(|| { + for (path, request) in data { + _ = resolver.resolve(path, request); + } + }); + }); + } + + // bench oxc_resolver + { + let resolver = oxc_resolver::Resolver::default(); + // Check path is valid + for (path, request) in &data { + assert!(resolver.resolve(path, request).is_ok(), "{path:?} {request}"); + } + c.bench_with_input(BenchmarkId::new("oxc_resolver", ""), &data, |b, data| { + b.iter(|| { + for (path, request) in data { + _ = resolver.resolve(path, request); + } + }); + }); + } +} + +criterion_group!(benches, resolver_benchmark); criterion_main!(benches);