Skip to content

Commit

Permalink
perf(common): Fix perf bug of sourcemap for inputs with multi-byte ch…
Browse files Browse the repository at this point in the history
…ars (#6523)

**Description:**

This PR makes the source map generator cache the previous position instead of searching it from 0 every time.

**Related issue:**

 - Closes #6411.
  • Loading branch information
kdy1 committed Nov 28, 2022
1 parent 2d70c30 commit 47908a4
Show file tree
Hide file tree
Showing 4 changed files with 39 additions and 10 deletions.
7 changes: 4 additions & 3 deletions crates/swc/benches/minify.rs
Expand Up @@ -46,7 +46,7 @@ fn bench_minify(b: &mut Bencher, filename: &str) {
module: Default::default(),
safari10: Default::default(),
toplevel: true,
source_map: Default::default(),
source_map: BoolOrDataConfig::from_bool(true),
output_path: Default::default(),
inline_sources_content: true,
emit_source_map_columns: true,
Expand All @@ -56,9 +56,9 @@ fn bench_minify(b: &mut Bencher, filename: &str) {
})
.unwrap();

let res = black_box(res);
black_box(res);

assert_eq!(res.map, None);
// assert_eq!(res.map, None);
})
}

Expand All @@ -84,6 +84,7 @@ fn files_group(c: &mut Criterion) {
bench_file("typescript");
bench_file("victory");
bench_file("vue");
// bench_file("large");
}

criterion_group!(benches, files_group);
Expand Down
4 changes: 3 additions & 1 deletion crates/swc/scripts/instrument.sh
@@ -1,5 +1,7 @@
#!/usr/bin/env bash
set -eu

cargo profile instruments --release -t time --bench typescript --features tracing/release_max_level_info -- --bench $@
export RUST_LOG=off

cargo profile instruments --release -t time --bench minify --features tracing/release_max_level_info -- --bench $@
# MINIFY=1 cargo profile instruments --release -t time --bench typescript --features concurrent,tracing/release_max_level_info $@
1 change: 0 additions & 1 deletion crates/swc_common/src/lib.rs
Expand Up @@ -32,7 +32,6 @@
//!
//! Use `fxhash` instead of `ahash` for `AHashMap` and `AHashSet`.
#![deny(clippy::all)]
#![deny(unused)]
#![cfg_attr(docsrs, feature(doc_cfg))]

use std::fmt::Debug;
Expand Down
37 changes: 32 additions & 5 deletions crates/swc_common/src/source_map.rs
Expand Up @@ -954,7 +954,7 @@ impl SourceMap {
}

fn bytepos_to_file_charpos_with(&self, map: &SourceFile, bpos: BytePos) -> CharPos {
let total_extra_bytes = self.calc_extra_bytes(map, &mut 0, bpos);
let total_extra_bytes = self.calc_extra_bytes(map, &mut 0, &mut 0, bpos);
assert!(
map.start_pos.to_u32() + total_extra_bytes <= bpos.to_u32(),
"map.start_pos = {:?}; total_extra_bytes = {}; bpos = {:?}",
Expand All @@ -966,9 +966,15 @@ impl SourceMap {
}

/// Converts an absolute BytePos to a CharPos relative to the source_file.
fn calc_extra_bytes(&self, map: &SourceFile, start: &mut usize, bpos: BytePos) -> u32 {
fn calc_extra_bytes(
&self,
map: &SourceFile,
prev_total_extra_bytes: &mut u32,
start: &mut usize,
bpos: BytePos,
) -> u32 {
// The number of extra bytes due to multibyte chars in the SourceFile
let mut total_extra_bytes = 0;
let mut total_extra_bytes = *prev_total_extra_bytes;

for (i, &mbc) in map.multibyte_chars[*start..].iter().enumerate() {
debug!("{}-byte char at {:?}", mbc.bytes, mbc.pos);
Expand All @@ -991,6 +997,8 @@ impl SourceMap {
}
}

*prev_total_extra_bytes = total_extra_bytes;

total_extra_bytes
}

Expand Down Expand Up @@ -1183,6 +1191,11 @@ impl SourceMap {

let mut prev_dst_line = u32::MAX;

let mut prev_extra_bytes = 0;
let mut ch_start = 0;
let mut line_prev_extra_bytes = 0;
let mut line_ch_start = 0;

for (pos, lc) in mappings.iter() {
let pos = *pos;

Expand Down Expand Up @@ -1214,6 +1227,12 @@ impl SourceMap {
builder.set_source_contents(src_id, Some(&f.src));
}

prev_extra_bytes = 0;
ch_start = 0;

line_prev_extra_bytes = 0;
line_ch_start = 0;

cur_file = Some(f.clone());
&f
}
Expand All @@ -1240,6 +1259,7 @@ impl SourceMap {
}

let mut line = a + 1; // Line numbers start at 1

let linebpos = f.lines[a as usize];
debug_assert!(
pos >= linebpos,
Expand All @@ -1248,8 +1268,15 @@ impl SourceMap {
pos,
linebpos,
);
let chpos = pos.to_u32() - self.calc_extra_bytes(f, &mut 0, pos);
let linechpos = linebpos.to_u32() - self.calc_extra_bytes(f, &mut 0, linebpos);
let chpos =
pos.to_u32() - self.calc_extra_bytes(f, &mut prev_extra_bytes, &mut ch_start, pos);
let linechpos = linebpos.to_u32()
- self.calc_extra_bytes(
f,
&mut line_prev_extra_bytes,
&mut line_ch_start,
linebpos,
);

let mut col = max(chpos, linechpos) - min(chpos, linechpos);

Expand Down

1 comment on commit 47908a4

@github-actions
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Benchmark

Benchmark suite Current: 47908a4 Previous: cc4646a Ratio
es/full/bugs-1 391138 ns/iter (± 125747) 427490 ns/iter (± 25483) 0.91
es/full/minify/libraries/antd 2173161351 ns/iter (± 71595469) 2164778769 ns/iter (± 55831870) 1.00
es/full/minify/libraries/d3 492381330 ns/iter (± 34719725) 455095668 ns/iter (± 37006585) 1.08
es/full/minify/libraries/echarts 1771885198 ns/iter (± 79964702) 1834002752 ns/iter (± 56534552) 0.97
es/full/minify/libraries/jquery 119091830 ns/iter (± 5908570) 120434670 ns/iter (± 3281561) 0.99
es/full/minify/libraries/lodash 129430278 ns/iter (± 4953714) 140268580 ns/iter (± 1341221) 0.92
es/full/minify/libraries/moment 66036132 ns/iter (± 1596100) 72196287 ns/iter (± 1747121) 0.91
es/full/minify/libraries/react 22741537 ns/iter (± 3032009) 24877755 ns/iter (± 672562) 0.91
es/full/minify/libraries/terser 363410825 ns/iter (± 9358258) 324432633 ns/iter (± 22916747) 1.12
es/full/minify/libraries/three 668735226 ns/iter (± 21672065) 572280794 ns/iter (± 4147844) 1.17
es/full/minify/libraries/typescript 3983337552 ns/iter (± 26936780) 3874189984 ns/iter (± 32924844) 1.03
es/full/minify/libraries/victory 971160298 ns/iter (± 22086738) 878293545 ns/iter (± 45104561) 1.11
es/full/minify/libraries/vue 184788200 ns/iter (± 6651278) 179530844 ns/iter (± 7878381) 1.03
es/full/codegen/es3 34304 ns/iter (± 7708) 41604 ns/iter (± 2580) 0.82
es/full/codegen/es5 33904 ns/iter (± 2633) 39992 ns/iter (± 1763) 0.85
es/full/codegen/es2015 33768 ns/iter (± 717) 39806 ns/iter (± 2689) 0.85
es/full/codegen/es2016 33778 ns/iter (± 1430) 40047 ns/iter (± 1196) 0.84
es/full/codegen/es2017 33697 ns/iter (± 1972) 40196 ns/iter (± 1112) 0.84
es/full/codegen/es2018 33597 ns/iter (± 305) 40634 ns/iter (± 1292) 0.83
es/full/codegen/es2019 33691 ns/iter (± 364) 40004 ns/iter (± 2293) 0.84
es/full/codegen/es2020 33694 ns/iter (± 280) 40044 ns/iter (± 1370) 0.84
es/full/all/es3 191229107 ns/iter (± 11287539) 228574475 ns/iter (± 5720904) 0.84
es/full/all/es5 177967707 ns/iter (± 8394351) 219641587 ns/iter (± 9513814) 0.81
es/full/all/es2015 147053590 ns/iter (± 8506577) 175799988 ns/iter (± 8346251) 0.84
es/full/all/es2016 145335693 ns/iter (± 6541120) 176330961 ns/iter (± 7668247) 0.82
es/full/all/es2017 148985568 ns/iter (± 14271004) 172756372 ns/iter (± 4678786) 0.86
es/full/all/es2018 157269652 ns/iter (± 15653162) 171356401 ns/iter (± 4282540) 0.92
es/full/all/es2019 139370021 ns/iter (± 9452236) 170071991 ns/iter (± 5781264) 0.82
es/full/all/es2020 137019533 ns/iter (± 7781730) 163614586 ns/iter (± 10585798) 0.84
es/full/parser 688236 ns/iter (± 33180) 873173 ns/iter (± 28562) 0.79
es/full/base/fixer 25801 ns/iter (± 1006) 31921 ns/iter (± 498) 0.81
es/full/base/resolver_and_hygiene 90790 ns/iter (± 7772) 113116 ns/iter (± 4782) 0.80
serialization of ast node 205 ns/iter (± 4) 247 ns/iter (± 7) 0.83
serialization of serde 212 ns/iter (± 5) 255 ns/iter (± 9) 0.83

This comment was automatically generated by workflow using github-action-benchmark.

Please sign in to comment.