From 970f32398c6ff444540a31e1172a33b6155ed18b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Donny/=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Tue, 16 Jul 2024 08:21:01 +0900 Subject: [PATCH] perf(es/codegen): Use scoped allocator (#9248) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit **Description:** Main: 스크린샷 2024-07-15 오후 8 05 50 new: 스크린샷 2024-07-15 오후 8 05 19 --- Cargo.lock | 5 +++++ crates/swc_compiler_base/Cargo.toml | 1 + crates/swc_compiler_base/src/lib.rs | 4 ++-- crates/swc_ecma_ast/src/stmt.rs | 2 +- crates/swc_ecma_codegen/Cargo.toml | 1 + crates/swc_ecma_codegen/benches/bench.rs | 8 ++++++-- crates/swc_ecma_codegen/benches/with_parse.rs | 3 ++- crates/swc_ecma_codegen/examples/sourcemap.rs | 5 +++-- crates/swc_ecma_codegen/src/tests.rs | 5 +++-- crates/swc_ecma_codegen/src/text_writer/basic_impl.rs | 1 + crates/swc_ecma_codegen/tests/sourcemap.rs | 3 ++- crates/swc_ecma_transforms_base/Cargo.toml | 1 + crates/swc_ecma_transforms_react/Cargo.toml | 1 + .../src/pure_annotations/tests.rs | 5 +++-- crates/swc_fast_ts_strip/Cargo.toml | 1 + crates/swc_fast_ts_strip/src/lib.rs | 2 +- 16 files changed, 34 insertions(+), 14 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index dcc366fbd301..ca80e56ce48e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3841,6 +3841,7 @@ dependencies = [ "serde", "serde_json", "sourcemap", + "swc_allocator", "swc_atoms", "swc_common", "swc_config", @@ -4151,6 +4152,7 @@ dependencies = [ "serde", "serde_json", "sourcemap", + "swc_allocator", "swc_atoms", "swc_common", "swc_ecma_ast", @@ -4592,6 +4594,7 @@ dependencies = [ "rustc-hash", "serde", "smallvec", + "swc_allocator", "swc_atoms", "swc_common", "swc_ecma_ast", @@ -4763,6 +4766,7 @@ dependencies = [ "serde", "sha1", "string_enum", + "swc_allocator", "swc_atoms", "swc_common", "swc_config", @@ -4966,6 +4970,7 @@ dependencies = [ "codspeed-criterion-compat", "criterion", "serde", + "swc_allocator", "swc_common", "swc_ecma_ast", "swc_ecma_codegen", diff --git a/crates/swc_compiler_base/Cargo.toml b/crates/swc_compiler_base/Cargo.toml index 4a92bee18538..725e028915d8 100644 --- a/crates/swc_compiler_base/Cargo.toml +++ b/crates/swc_compiler_base/Cargo.toml @@ -21,6 +21,7 @@ rustc-hash = { workspace = true } serde = { workspace = true, features = ["derive"] } serde_json = { workspace = true } sourcemap = { workspace = true } +swc_allocator = { version = "0.1.5", path = "../swc_allocator", default-features = false } swc_atoms = { version = "0.6.5", path = "../swc_atoms" } swc_common = { version = "0.35.0", path = "../swc_common", features = [ diff --git a/crates/swc_compiler_base/src/lib.rs b/crates/swc_compiler_base/src/lib.rs index 2def122b13ba..60592cae351a 100644 --- a/crates/swc_compiler_base/src/lib.rs +++ b/crates/swc_compiler_base/src/lib.rs @@ -171,10 +171,10 @@ where { let _timer = timer!("Compiler::print"); - let mut src_map_buf = vec![]; + let mut src_map_buf = swc_allocator::vec::Vec::new(); let src = { - let mut buf = vec![]; + let mut buf = Vec::new(); { let mut w = swc_ecma_codegen::text_writer::JsWriter::new( cm.clone(), diff --git a/crates/swc_ecma_ast/src/stmt.rs b/crates/swc_ecma_ast/src/stmt.rs index 32665b359a73..c19460bbcf7f 100644 --- a/crates/swc_ecma_ast/src/stmt.rs +++ b/crates/swc_ecma_ast/src/stmt.rs @@ -164,7 +164,7 @@ impl Stmt { } } -// Memory layout depedns on the version of rustc. +// Memory layout depends on the version of rustc. // #[cfg(target_pointer_width = "64")] // assert_eq_size!(Stmt, [u8; 56]); diff --git a/crates/swc_ecma_codegen/Cargo.toml b/crates/swc_ecma_codegen/Cargo.toml index efca69e793ce..8d2e840ebdbe 100644 --- a/crates/swc_ecma_codegen/Cargo.toml +++ b/crates/swc_ecma_codegen/Cargo.toml @@ -25,6 +25,7 @@ serde = { workspace = true } sourcemap = { workspace = true } tracing = { workspace = true } +swc_allocator = { version = "0.1.5", path = "../swc_allocator" } swc_atoms = { version = "0.6.5", path = "../swc_atoms" } swc_common = { version = "0.35.0", path = "../swc_common" } swc_ecma_ast = { version = "0.116.0", path = "../swc_ecma_ast" } diff --git a/crates/swc_ecma_codegen/benches/bench.rs b/crates/swc_ecma_codegen/benches/bench.rs index 9c820aeeac3c..af47725357e4 100644 --- a/crates/swc_ecma_codegen/benches/bench.rs +++ b/crates/swc_ecma_codegen/benches/bench.rs @@ -1,6 +1,7 @@ extern crate swc_malloc; use codspeed_criterion_compat::{black_box, criterion_group, criterion_main, Bencher, Criterion}; +use swc_allocator::{vec::Vec, Allocator}; use swc_common::FileName; use swc_ecma_codegen::Emitter; use swc_ecma_parser::{Parser, StringInput, Syntax}; @@ -84,7 +85,6 @@ fn bench_emitter(b: &mut Bencher, s: &str) { let fm = cm.new_source_file(FileName::Anon.into(), s.into()); let mut parser = Parser::new(Syntax::default(), StringInput::from(&*fm), None); - let mut src_map_buf = vec![]; let module = parser .parse_module() .map_err(|e| e.into_diagnostic(handler).emit()) @@ -95,7 +95,11 @@ fn bench_emitter(b: &mut Bencher, s: &str) { } b.iter(|| { - let mut buf = vec![]; + let alloc = Allocator::default(); + let _guard = unsafe { alloc.guard() }; + let mut src_map_buf = Vec::new(); + + let mut buf = Vec::new(); { let mut emitter = Emitter { cfg: Default::default(), diff --git a/crates/swc_ecma_codegen/benches/with_parse.rs b/crates/swc_ecma_codegen/benches/with_parse.rs index d0ff27b97d61..a08132e44f6a 100644 --- a/crates/swc_ecma_codegen/benches/with_parse.rs +++ b/crates/swc_ecma_codegen/benches/with_parse.rs @@ -1,6 +1,7 @@ extern crate swc_malloc; use codspeed_criterion_compat::{black_box, criterion_group, criterion_main, Bencher, Criterion}; +use swc_allocator::vec::Vec; use swc_common::FileName; use swc_ecma_codegen::Emitter; use swc_ecma_parser::{Parser, StringInput, Syntax}; @@ -84,7 +85,7 @@ fn bench_emitter(b: &mut Bencher, s: &str) { b.iter(|| { let fm = cm.new_source_file(FileName::Anon.into(), s.into()); let mut parser = Parser::new(Syntax::default(), StringInput::from(&*fm), None); - let mut src_map_buf = vec![]; + let mut src_map_buf = Vec::new(); let module = parser .parse_module() .map_err(|e| e.into_diagnostic(handler).emit()) diff --git a/crates/swc_ecma_codegen/examples/sourcemap.rs b/crates/swc_ecma_codegen/examples/sourcemap.rs index e18522086244..1f004bb406cd 100644 --- a/crates/swc_ecma_codegen/examples/sourcemap.rs +++ b/crates/swc_ecma_codegen/examples/sourcemap.rs @@ -9,6 +9,7 @@ use std::{ time::Instant, }; +use swc_allocator::vec::Vec; use swc_common::input::SourceFileInput; use swc_ecma_ast::*; use swc_ecma_codegen::{text_writer::JsWriter, Emitter}; @@ -30,7 +31,7 @@ fn parse_and_gen(entry: &Path) { .expect("failed to parse input as a module"); let mut code = vec![]; - let mut srcmap = vec![]; + let mut srcmap = Vec::new(); { let mut emitter = Emitter { @@ -56,7 +57,7 @@ fn parse_and_gen(entry: &Path) { .expect("failed to process a module"); } -/// Usage: ./scripts/instruements path/to/input/file +/// Usage: ./scripts/instruments path/to/input/file fn main() { let main_file = env::args().nth(1).unwrap(); diff --git a/crates/swc_ecma_codegen/src/tests.rs b/crates/swc_ecma_codegen/src/tests.rs index 3a89dd94d4fa..a86ba42ffa42 100644 --- a/crates/swc_ecma_codegen/src/tests.rs +++ b/crates/swc_ecma_codegen/src/tests.rs @@ -1,5 +1,6 @@ use std::path::PathBuf; +use swc_allocator::vec::Vec; use swc_common::{comments::SingleThreadedComments, FileName, SourceMap}; use swc_ecma_parser; use swc_ecma_testing::{exec_node_js, JsExecOptions}; @@ -44,11 +45,11 @@ impl Builder { where F: for<'aa> FnOnce(&mut Emitter<'aa, Box<(dyn WriteJs + 'aa)>, SourceMap>), { - let mut buf = vec![]; + let mut buf = Vec::new(); self.with(src, &mut buf, op); - String::from_utf8(buf).unwrap() + String::from_utf8_lossy(&buf).into_owned() } } diff --git a/crates/swc_ecma_codegen/src/text_writer/basic_impl.rs b/crates/swc_ecma_codegen/src/text_writer/basic_impl.rs index e21389cc474f..055317a54feb 100644 --- a/crates/swc_ecma_codegen/src/text_writer/basic_impl.rs +++ b/crates/swc_ecma_codegen/src/text_writer/basic_impl.rs @@ -1,6 +1,7 @@ use std::io::Write; use rustc_hash::FxHashSet; +use swc_allocator::vec::Vec; use swc_common::{sync::Lrc, BytePos, LineCol, SourceMap, Span}; use super::{Result, WriteJs}; diff --git a/crates/swc_ecma_codegen/tests/sourcemap.rs b/crates/swc_ecma_codegen/tests/sourcemap.rs index 1fdaec759198..73ffa99d9767 100644 --- a/crates/swc_ecma_codegen/tests/sourcemap.rs +++ b/crates/swc_ecma_codegen/tests/sourcemap.rs @@ -3,6 +3,7 @@ use std::{fs::read_to_string, path::PathBuf}; use base64::prelude::{Engine, BASE64_STANDARD}; use rustc_hash::FxHashSet; use sourcemap::SourceMap; +use swc_allocator::vec::Vec; use swc_common::{comments::SingleThreadedComments, source_map::SourceMapGenConfig}; use swc_ecma_ast::EsVersion; use swc_ecma_codegen::{text_writer::WriteJs, Emitter}; @@ -315,7 +316,7 @@ fn identity(entry: PathBuf) { Some(&comments), ); let mut parser: Parser = Parser::new_from(lexer); - let mut src_map = vec![]; + let mut src_map = Vec::new(); { let mut wr = Box::new(swc_ecma_codegen::text_writer::JsWriter::new( diff --git a/crates/swc_ecma_transforms_base/Cargo.toml b/crates/swc_ecma_transforms_base/Cargo.toml index 0c397657ba75..44c430415c89 100644 --- a/crates/swc_ecma_transforms_base/Cargo.toml +++ b/crates/swc_ecma_transforms_base/Cargo.toml @@ -34,6 +34,7 @@ swc_ecma_ast = { version = "0.116.0", path = "../swc_ecma_ast" } swc_ecma_parser = { version = "0.147.0", path = "../swc_ecma_parser" } swc_ecma_utils = { version = "0.131.0", path = "../swc_ecma_utils" } swc_ecma_visit = { version = "0.102.0", path = "../swc_ecma_visit" } +swc_allocator = { version = "0.1.5", path = "../swc_allocator", default-features = false } [dev-dependencies] codspeed-criterion-compat = { workspace = true } diff --git a/crates/swc_ecma_transforms_react/Cargo.toml b/crates/swc_ecma_transforms_react/Cargo.toml index 7c8ced316768..cfc3f6ee1851 100644 --- a/crates/swc_ecma_transforms_react/Cargo.toml +++ b/crates/swc_ecma_transforms_react/Cargo.toml @@ -27,6 +27,7 @@ serde = { workspace = true, features = ["derive"], optional = true } sha1 = { workspace = true } string_enum = { version = "0.4.4", path = "../string_enum" } +swc_allocator = { version = "0.1.5", path = "../swc_allocator", default-features = false } swc_atoms = { version = "0.6.5", path = "../swc_atoms" } swc_common = { version = "0.35.0", path = "../swc_common" } swc_config = { version = "0.1.13", path = "../swc_config" } diff --git a/crates/swc_ecma_transforms_react/src/pure_annotations/tests.rs b/crates/swc_ecma_transforms_react/src/pure_annotations/tests.rs index b7aeb94bf43f..4ae2ae269867 100644 --- a/crates/swc_ecma_transforms_react/src/pure_annotations/tests.rs +++ b/crates/swc_ecma_transforms_react/src/pure_annotations/tests.rs @@ -1,3 +1,4 @@ +use swc_allocator::vec::Vec; use swc_common::{comments::SingleThreadedComments, sync::Lrc, FileName, Mark, SourceMap}; use swc_ecma_codegen::{text_writer::JsWriter, Emitter}; use swc_ecma_parser::{Parser, StringInput}; @@ -40,8 +41,8 @@ fn emit( comments: Lrc, program: &Module, ) -> String { - let mut src_map_buf = vec![]; - let mut buf = vec![]; + let mut src_map_buf = Vec::new(); + let mut buf = std::vec::Vec::new(); { let writer = Box::new(JsWriter::new( source_map.clone(), diff --git a/crates/swc_fast_ts_strip/Cargo.toml b/crates/swc_fast_ts_strip/Cargo.toml index 47d9eaa4d111..7d680bdfe285 100644 --- a/crates/swc_fast_ts_strip/Cargo.toml +++ b/crates/swc_fast_ts_strip/Cargo.toml @@ -13,6 +13,7 @@ version = "0.2.2" [dependencies] anyhow = { workspace = true } serde = { workspace = true, features = ["derive"] } +swc_allocator = { version = "0.1.5", path = "../swc_allocator", default-features = false } swc_common = { version = "0.35.0", path = "../swc_common", features = [ "sourcemap", diff --git a/crates/swc_fast_ts_strip/src/lib.rs b/crates/swc_fast_ts_strip/src/lib.rs index f2ea8400834b..92e2b78c9e90 100644 --- a/crates/swc_fast_ts_strip/src/lib.rs +++ b/crates/swc_fast_ts_strip/src/lib.rs @@ -241,7 +241,7 @@ pub fn operate( let mut src = vec![]; let mut src_map_buf = if options.source_map { - Some(vec![]) + Some(swc_allocator::vec::Vec::new()) } else { None };