mirror of
https://github.com/oxc-project/oxc.git
synced 2026-11-04 10:29:58 +00:00
perf(formatter_css,formatter_graphql,formatter_yaml,formatter_json): Pre alloc IR buffers (#25234)
As like `oxc_formatter`(js).
This commit is contained in:
1 parent
eaa7c692d2
commit
b91d5a8afe
5 files changed
+18
-10
No files matched your search
@@ -45,8 +45,7 @@ pub fn format<'ast>(
|
||||
) -> Formatted<'ast, JsFormatContext<'ast>> {
|
||||
// Pre-allocate buffer at 40% of source length (source_len * 2 / 5).
|
||||
// Analysis of 4,891 VSCode files shows FormatElement buffer length is typically 19% of source (median),
|
||||
// with 95th percentile at 30-38% across all file sizes. This 0.4x multiplier avoids
|
||||
// reallocation for 95%+ of files.
|
||||
// with 95th percentile at 30-38% across all file sizes. This 0.4x multiplier avoids reallocation for 95%+ of files.
|
||||
let capacity = (context.source_text().len() * 2) / 5;
|
||||
|
||||
let mut state = FormatState::new(context, allocator);
|
||||
|
||||
@@ -49,8 +49,10 @@ pub fn format<'a>(
|
||||
let context =
|
||||
CssFormatContext::new(options, source, comments, /* template_placeholders */ false);
|
||||
let mut state = FormatState::new(context, allocator);
|
||||
// TODO: Use `with_capacity` for perf, like `oxc_formatter` does
|
||||
let mut buffer = VecBuffer::new(&mut state);
|
||||
// Pre-allocate: measured on 616 real-world files (bootstrap, vscode, saleor; css/scss/less),
|
||||
// 0.5x source bytes plus a 1024-element floor for tiny-file spikes avoids reallocation for 98% of the corpus.
|
||||
let capacity = (source.len() / 2).max(1024);
|
||||
let mut buffer = VecBuffer::with_capacity(capacity, &mut state);
|
||||
|
||||
write!(&mut buffer, FormatCssRoot { stylesheet: &stylesheet, has_bom, front_matter });
|
||||
|
||||
|
||||
@@ -32,8 +32,10 @@ pub fn format<'a>(
|
||||
|
||||
let context = GraphqlFormatContext::new(options, source, comments);
|
||||
let mut state = FormatState::new(context, allocator);
|
||||
// TODO: Use `with_capacity` for perf, like `oxc_formatter` does
|
||||
let mut buffer = VecBuffer::new(&mut state);
|
||||
// Pre-allocate: measured on 1,241 real-world files (gitlab operations, github/saleor schemas),
|
||||
// 0.4x source bytes plus a 1024-element floor for small operation documents avoided reallocation for the entire corpus.
|
||||
let capacity = (source.len() * 2 / 5).max(1024);
|
||||
let mut buffer = VecBuffer::with_capacity(capacity, &mut state);
|
||||
|
||||
write!(&mut buffer, FormatGraphqlRoot { document, has_bom });
|
||||
|
||||
|
||||
@@ -35,8 +35,11 @@ pub fn format<'a>(
|
||||
parsed.source_offset,
|
||||
);
|
||||
let mut state = FormatState::new(context, allocator);
|
||||
// TODO: Use `with_capacity` for perf, like `oxc_formatter` does
|
||||
let mut buffer = VecBuffer::new(&mut state);
|
||||
// Pre-allocate: measured on 1,447 real-world files (vscode, saleor, bootstrap),
|
||||
// 0.3x source bytes plus a 1024-element floor for tiny-file spikes (`{}` is 3 elements)
|
||||
// avoids reallocation for 99.5% of the corpus.
|
||||
let capacity = (source_text.len() * 3 / 10).max(1024);
|
||||
let mut buffer = VecBuffer::with_capacity(capacity, &mut state);
|
||||
|
||||
// BOM detection runs on the original `source_text`; `wrapped_source` may prepend `(`.
|
||||
let has_bom = source_text.starts_with(ZWNBSP);
|
||||
|
||||
@@ -31,8 +31,10 @@ pub fn format<'a>(
|
||||
let context =
|
||||
YamlFormatContext::new(options, source, comments, print::last_descendant_end(root));
|
||||
let mut state = FormatState::new(context, allocator);
|
||||
// TODO: Use `with_capacity` for perf, like `oxc_formatter` does
|
||||
let mut buffer = VecBuffer::new(&mut state);
|
||||
// Pre-allocate: measured on 6,925 real-world files (kubernetes, vscode, saleor, bootstrap),
|
||||
// 0.3x source bytes plus a 1024-element floor for tiny-file spikes avoids reallocation for 99.9% of the corpus.
|
||||
let capacity = (source.len() * 3 / 10).max(1024);
|
||||
let mut buffer = VecBuffer::with_capacity(capacity, &mut state);
|
||||
|
||||
write!(&mut buffer, FormatYamlRoot { root, has_bom });
|
||||
|
||||
|
||||
Reference in new issue
Block a user