Skip to content

Commit

Permalink
feat(common): Add an API to create a SourceFile without allocation (#…
Browse files Browse the repository at this point in the history
  • Loading branch information
kdy1 committed Mar 7, 2023
1 parent e93c79b commit 81495f5
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 6 deletions.
14 changes: 12 additions & 2 deletions crates/swc_common/src/source_map.rs
Expand Up @@ -202,7 +202,17 @@ impl SourceMap {

/// Creates a new source_file.
/// This does not ensure that only one SourceFile exists per file name.
pub fn new_source_file(&self, filename: FileName, src: String) -> Lrc<SourceFile> {
pub fn new_source_file(&self, filename: FileName, mut src: String) -> Lrc<SourceFile> {
remove_bom(&mut src);

self.new_source_file_from(filename, Lrc::new(src))
}

/// Creates a new source_file.
/// This does not ensure that only one SourceFile exists per file name.
///
/// `src` should not have UTF8 BOM
pub fn new_source_file_from(&self, filename: FileName, src: Lrc<String>) -> Lrc<SourceFile> {
// The path is used to determine the directory for loading submodules and
// include files, so it must be before remapping.
// Note that filename may not be a valid path, eg it may be `<anon>` etc,
Expand All @@ -224,7 +234,7 @@ impl SourceMap {

let start_pos = self.next_start_pos(src.len());

let source_file = Lrc::new(SourceFile::new(
let source_file = Lrc::new(SourceFile::new_from(
filename,
was_remapped,
unmapped_path,
Expand Down
25 changes: 21 additions & 4 deletions crates/swc_common/src/syntax_pos.rs
Expand Up @@ -869,15 +869,32 @@ impl SourceFile {
unmapped_path: FileName,
mut src: String,
start_pos: BytePos,
) -> SourceFile {
remove_bom(&mut src);

Self::new_from(
name,
name_was_remapped,
unmapped_path,
Lrc::new(src),
start_pos,
)
}

/// `src` should not have UTF8 BOM
pub fn new_from(
name: FileName,
name_was_remapped: bool,
unmapped_path: FileName,
src: Lrc<String>,
start_pos: BytePos,
) -> SourceFile {
debug_assert_ne!(
start_pos,
BytePos::DUMMY,
"BytePos::DUMMY is reserved and `SourceFile` should not use it"
);

remove_bom(&mut src);

let src_hash = {
let mut hasher: StableHasher = StableHasher::new();
hasher.write(src.as_bytes());
Expand All @@ -898,7 +915,7 @@ impl SourceFile {
name_was_remapped,
unmapped_path: Some(unmapped_path),
crate_of_origin: 0,
src: Lrc::new(src),
src,
src_hash,
start_pos,
end_pos: Pos::from_usize(end_pos),
Expand Down Expand Up @@ -988,7 +1005,7 @@ impl SourceFile {
}

/// Remove utf-8 BOM if any.
fn remove_bom(src: &mut String) {
pub(super) fn remove_bom(src: &mut String) {
if src.starts_with('\u{feff}') {
src.drain(..3);
}
Expand Down

1 comment on commit 81495f5

@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: 81495f5 Previous: 5c7c8e0 Ratio
es/full/bugs-1 287742 ns/iter (± 18721) 301094 ns/iter (± 12497) 0.96
es/full/minify/libraries/antd 1568454661 ns/iter (± 38930603) 1657709476 ns/iter (± 26184733) 0.95
es/full/minify/libraries/d3 302728403 ns/iter (± 6831882) 309924932 ns/iter (± 2294371) 0.98
es/full/minify/libraries/echarts 1234235133 ns/iter (± 17321302) 1285100617 ns/iter (± 13493751) 0.96
es/full/minify/libraries/jquery 91209889 ns/iter (± 580595) 94742408 ns/iter (± 961116) 0.96
es/full/minify/libraries/lodash 107097381 ns/iter (± 1073092) 111173721 ns/iter (± 1092952) 0.96
es/full/minify/libraries/moment 53048199 ns/iter (± 255403) 55361888 ns/iter (± 860601) 0.96
es/full/minify/libraries/react 19189105 ns/iter (± 78788) 20102284 ns/iter (± 128852) 0.95
es/full/minify/libraries/terser 246166505 ns/iter (± 2725256) 270505273 ns/iter (± 4628189) 0.91
es/full/minify/libraries/three 441284391 ns/iter (± 6143060) 474770831 ns/iter (± 4787310) 0.93
es/full/minify/libraries/typescript 3040887387 ns/iter (± 35474444) 3146761044 ns/iter (± 25694488) 0.97
es/full/minify/libraries/victory 663142186 ns/iter (± 7197353) 733607838 ns/iter (± 8363041) 0.90
es/full/minify/libraries/vue 131817112 ns/iter (± 1209312) 141280955 ns/iter (± 3086644) 0.93
es/full/codegen/es3 26037 ns/iter (± 56) 25927 ns/iter (± 49) 1.00
es/full/codegen/es5 26054 ns/iter (± 89) 25896 ns/iter (± 124) 1.01
es/full/codegen/es2015 25889 ns/iter (± 101) 25891 ns/iter (± 31) 1.00
es/full/codegen/es2016 25953 ns/iter (± 81) 25832 ns/iter (± 60) 1.00
es/full/codegen/es2017 25939 ns/iter (± 117) 25858 ns/iter (± 45) 1.00
es/full/codegen/es2018 26051 ns/iter (± 155) 25853 ns/iter (± 29) 1.01
es/full/codegen/es2019 25952 ns/iter (± 73) 25869 ns/iter (± 62) 1.00
es/full/codegen/es2020 26011 ns/iter (± 153) 25893 ns/iter (± 51) 1.00
es/full/all/es3 174019654 ns/iter (± 1257757) 172569114 ns/iter (± 3187681) 1.01
es/full/all/es5 166112310 ns/iter (± 2715070) 163946971 ns/iter (± 2186911) 1.01
es/full/all/es2015 126365333 ns/iter (± 1914756) 128657414 ns/iter (± 2328911) 0.98
es/full/all/es2016 126526043 ns/iter (± 1111576) 125998695 ns/iter (± 1247052) 1.00
es/full/all/es2017 124352623 ns/iter (± 1789836) 124492579 ns/iter (± 2649321) 1.00
es/full/all/es2018 121867259 ns/iter (± 1288301) 123527471 ns/iter (± 1513041) 0.99
es/full/all/es2019 121633748 ns/iter (± 1466660) 120771687 ns/iter (± 1348795) 1.01
es/full/all/es2020 116645062 ns/iter (± 766493) 116138959 ns/iter (± 1236819) 1.00
es/full/parser 543709 ns/iter (± 6654) 533566 ns/iter (± 8892) 1.02
es/full/base/fixer 21799 ns/iter (± 68) 22025 ns/iter (± 42) 0.99
es/full/base/resolver_and_hygiene 81683 ns/iter (± 221) 81943 ns/iter (± 851) 1.00
serialization of ast node 145 ns/iter (± 0) 146 ns/iter (± 0) 0.99
serialization of serde 133 ns/iter (± 0) 134 ns/iter (± 0) 0.99
css/minify/libraries/bootstrap 27841848 ns/iter (± 120456) 29146530 ns/iter (± 312025) 0.96
css/visitor/compare/clone 2079941 ns/iter (± 25169) 2080925 ns/iter (± 16110) 1.00
css/visitor/compare/visit_mut_span 2227599 ns/iter (± 7278) 2255078 ns/iter (± 23667) 0.99
css/visitor/compare/visit_mut_span_panic 2292604 ns/iter (± 7621) 2358798 ns/iter (± 13092) 0.97
css/visitor/compare/fold_span 3004834 ns/iter (± 54972) 3067214 ns/iter (± 22596) 0.98
css/visitor/compare/fold_span_panic 3166149 ns/iter (± 21312) 3204537 ns/iter (± 79369) 0.99
css/lexer/bootstrap_5_1_3 5201838 ns/iter (± 2003) 5226153 ns/iter (± 6005) 1.00
css/lexer/foundation_6_7_4 4374922 ns/iter (± 20181) 4403684 ns/iter (± 1518) 0.99
css/lexer/tailwind_3_1_1 832476 ns/iter (± 332) 838093 ns/iter (± 140) 0.99
css/parser/bootstrap_5_1_3 21999460 ns/iter (± 81084) 22349072 ns/iter (± 106895) 0.98
css/parser/foundation_6_7_4 17508247 ns/iter (± 51698) 17550616 ns/iter (± 39781) 1.00
css/parser/tailwind_3_1_1 3343951 ns/iter (± 1653) 3323135 ns/iter (± 2365) 1.01
es/codegen/colors 329483 ns/iter (± 185598) 317519 ns/iter (± 178285) 1.04
es/codegen/large 1368944 ns/iter (± 720718) 1229180 ns/iter (± 645088) 1.11
es/codegen/with-parser/colors 47941 ns/iter (± 405) 48172 ns/iter (± 137) 1.00
es/codegen/with-parser/large 525247 ns/iter (± 2772) 525595 ns/iter (± 1739) 1.00
es/minify/libraries/antd 1407821400 ns/iter (± 18123639) 1484095763 ns/iter (± 16912728) 0.95
es/minify/libraries/d3 254546813 ns/iter (± 4213222) 284777710 ns/iter (± 4605698) 0.89
es/minify/libraries/echarts 1067032347 ns/iter (± 15566791) 1129723085 ns/iter (± 5612154) 0.94
es/minify/libraries/jquery 80483740 ns/iter (± 542813) 82638604 ns/iter (± 682209) 0.97
es/minify/libraries/lodash 95212123 ns/iter (± 1011691) 100268650 ns/iter (± 1225149) 0.95
es/minify/libraries/moment 46530186 ns/iter (± 538726) 48521053 ns/iter (± 594667) 0.96
es/minify/libraries/react 17359697 ns/iter (± 134569) 17946989 ns/iter (± 189648) 0.97
es/minify/libraries/terser 215758275 ns/iter (± 2005949) 229492340 ns/iter (± 3252485) 0.94
es/minify/libraries/three 376249125 ns/iter (± 7838741) 400608172 ns/iter (± 6935948) 0.94
es/minify/libraries/typescript 2593624386 ns/iter (± 14488267) 2644231988 ns/iter (± 18385055) 0.98
es/minify/libraries/victory 565095221 ns/iter (± 12836959) 606842513 ns/iter (± 12731588) 0.93
es/minify/libraries/vue 116658945 ns/iter (± 1116996) 121984304 ns/iter (± 1818489) 0.96
es/visitor/compare/clone 2358281 ns/iter (± 18721) 2407855 ns/iter (± 41605) 0.98
es/visitor/compare/visit_mut_span 2808588 ns/iter (± 20132) 2808692 ns/iter (± 24969) 1.00
es/visitor/compare/visit_mut_span_panic 2905696 ns/iter (± 64472) 2903719 ns/iter (± 45079) 1.00
es/visitor/compare/fold_span 3946797 ns/iter (± 17319) 4007481 ns/iter (± 43935) 0.98
es/visitor/compare/fold_span_panic 4028151 ns/iter (± 17068) 4252276 ns/iter (± 33943) 0.95
es/lexer/colors 16422 ns/iter (± 39) 16208 ns/iter (± 16) 1.01
es/lexer/angular 7765709 ns/iter (± 18338) 7778734 ns/iter (± 4500) 1.00
es/lexer/backbone 1004238 ns/iter (± 1997) 1002453 ns/iter (± 452) 1.00
es/lexer/jquery 5570460 ns/iter (± 19049) 5583851 ns/iter (± 3785) 1.00
es/lexer/jquery mobile 8576818 ns/iter (± 6788) 8555946 ns/iter (± 9843) 1.00
es/lexer/mootools 4407414 ns/iter (± 2593) 4387132 ns/iter (± 1758) 1.00
es/lexer/underscore 841125 ns/iter (± 682) 835189 ns/iter (± 367) 1.01
es/lexer/three 26152013 ns/iter (± 11852) 26029861 ns/iter (± 16657) 1.00
es/lexer/yui 4804613 ns/iter (± 3293) 4778173 ns/iter (± 2803) 1.01
es/parser/colors 30277 ns/iter (± 174) 30316 ns/iter (± 31) 1.00
es/parser/angular 16082209 ns/iter (± 183016) 16622859 ns/iter (± 192007) 0.97
es/parser/backbone 2292802 ns/iter (± 12700) 2291867 ns/iter (± 10610) 1.00
es/parser/jquery 12557788 ns/iter (± 83791) 12880922 ns/iter (± 97217) 0.97
es/parser/jquery mobile 19756257 ns/iter (± 246540) 20819499 ns/iter (± 141022) 0.95
es/parser/mootools 9497314 ns/iter (± 25299) 9570930 ns/iter (± 31315) 0.99
es/parser/underscore 1940576 ns/iter (± 10960) 1929414 ns/iter (± 10451) 1.01
es/parser/three 58567934 ns/iter (± 142526) 58761672 ns/iter (± 107655) 1.00
es/parser/yui 9630506 ns/iter (± 78882) 10001697 ns/iter (± 158043) 0.96
es/preset-env/usage/builtin_type 141821 ns/iter (± 31885) 142977 ns/iter (± 32325) 0.99
es/preset-env/usage/property 21237 ns/iter (± 96) 21206 ns/iter (± 57) 1.00
es/resolver/typescript 114205235 ns/iter (± 1735373) 114819551 ns/iter (± 1667491) 0.99
es/fixer/typescript 87446004 ns/iter (± 763648) 86413546 ns/iter (± 347915) 1.01
es/hygiene/typescript 182847107 ns/iter (± 1323812) 186742529 ns/iter (± 1785878) 0.98
es/resolver_with_hygiene/typescript 308520147 ns/iter (± 1105423) 320004522 ns/iter (± 1716310) 0.96
es/visitor/base-perf/module_clone 75430 ns/iter (± 1851) 75277 ns/iter (± 1896) 1.00
es/visitor/base-perf/fold_empty 86838 ns/iter (± 1617) 85181 ns/iter (± 1334) 1.02
es/visitor/base-perf/fold_noop_impl_all 85758 ns/iter (± 1700) 85950 ns/iter (± 1908) 1.00
es/visitor/base-perf/fold_noop_impl_vec 87428 ns/iter (± 1593) 86220 ns/iter (± 997) 1.01
es/visitor/base-perf/boxing_boxed_clone 56 ns/iter (± 0) 56 ns/iter (± 0) 1
es/visitor/base-perf/boxing_unboxed_clone 59 ns/iter (± 0) 59 ns/iter (± 0) 1
es/visitor/base-perf/boxing_boxed 103 ns/iter (± 0) 105 ns/iter (± 0) 0.98
es/visitor/base-perf/boxing_unboxed 102 ns/iter (± 0) 103 ns/iter (± 0) 0.99
es/visitor/base-perf/visit_contains_this 3464 ns/iter (± 109) 3388 ns/iter (± 86) 1.02
es/base/parallel/resolver/typescript 5256004272 ns/iter (± 507828495) 5430738707 ns/iter (± 338429544) 0.97
es/base/parallel/hygiene/typescript 2144725225 ns/iter (± 35914187) 2122667238 ns/iter (± 31991894) 1.01
misc/visitors/time-complexity/time 5 101 ns/iter (± 0) 101 ns/iter (± 0) 1
misc/visitors/time-complexity/time 10 344 ns/iter (± 0) 325 ns/iter (± 0) 1.06
misc/visitors/time-complexity/time 15 653 ns/iter (± 0) 643 ns/iter (± 0) 1.02
misc/visitors/time-complexity/time 20 1216 ns/iter (± 0) 1219 ns/iter (± 4) 1.00
misc/visitors/time-complexity/time 40 6678 ns/iter (± 74) 6686 ns/iter (± 70) 1.00
misc/visitors/time-complexity/time 60 16979 ns/iter (± 43) 16976 ns/iter (± 26) 1.00
es/full-target/es2016 187827 ns/iter (± 438) 187302 ns/iter (± 444) 1.00
es/full-target/es2017 182505 ns/iter (± 505) 182772 ns/iter (± 351) 1.00
es/full-target/es2018 171664 ns/iter (± 609) 171856 ns/iter (± 355) 1.00
es2020_nullish_coalescing 66864 ns/iter (± 166) 66906 ns/iter (± 5073) 1.00
es2020_optional_chaining 96206 ns/iter (± 288) 96402 ns/iter (± 7165) 1.00
es2022_class_properties 93471 ns/iter (± 205) 93619 ns/iter (± 336) 1.00
es2018_object_rest_spread 71266 ns/iter (± 119) 71715 ns/iter (± 161) 0.99
es2019_optional_catch_binding 61277 ns/iter (± 157) 61461 ns/iter (± 245) 1.00
es2017_async_to_generator 61693 ns/iter (± 161) 61834 ns/iter (± 152) 1.00
es2016_exponentiation 65306 ns/iter (± 115) 65427 ns/iter (± 124) 1.00
es2015_arrow 70207 ns/iter (± 370) 70560 ns/iter (± 187) 0.99
es2015_block_scoped_fn 66568 ns/iter (± 149) 66597 ns/iter (± 106) 1.00
es2015_block_scoping 139339 ns/iter (± 8579) 145551 ns/iter (± 9171) 0.96
es2015_classes 117477 ns/iter (± 444) 117494 ns/iter (± 319) 1.00
es2015_computed_props 61547 ns/iter (± 133) 61434 ns/iter (± 46) 1.00
es2015_destructuring 117936 ns/iter (± 301) 117146 ns/iter (± 172) 1.01
es2015_duplicate_keys 64075 ns/iter (± 105) 63897 ns/iter (± 83) 1.00
es2015_parameters 80142 ns/iter (± 313) 79620 ns/iter (± 165) 1.01
es2015_fn_name 66902 ns/iter (± 552) 66931 ns/iter (± 447) 1.00
es2015_for_of 64429 ns/iter (± 147) 64565 ns/iter (± 89) 1.00
es2015_instanceof 63619 ns/iter (± 118) 63216 ns/iter (± 78) 1.01
es2015_shorthand_property 61482 ns/iter (± 140) 61203 ns/iter (± 93) 1.00
es2015_spread 61494 ns/iter (± 152) 61032 ns/iter (± 52) 1.01
es2015_sticky_regex 62921 ns/iter (± 77) 62545 ns/iter (± 63) 1.01
es2015_typeof_symbol 62498 ns/iter (± 160) 62410 ns/iter (± 58) 1.00
es/transform/baseline/base 51940 ns/iter (± 66) 51926 ns/iter (± 73) 1.00
es/transform/baseline/common_reserved_word 63022 ns/iter (± 126) 62814 ns/iter (± 85) 1.00
es/transform/baseline/common_typescript 169175 ns/iter (± 257) 141751 ns/iter (± 116) 1.19
es/target/es3 170976 ns/iter (± 262) 170337 ns/iter (± 244) 1.00
es/target/es2015 631264 ns/iter (± 1230) 634409 ns/iter (± 1376) 1.00
es/target/es2016 65265 ns/iter (± 495) 65349 ns/iter (± 131) 1.00
es/target/es2017 61803 ns/iter (± 96) 61712 ns/iter (± 235) 1.00
es/target/es2018 81569 ns/iter (± 166) 81778 ns/iter (± 168) 1.00
es/target/es2020 132198 ns/iter (± 345) 132675 ns/iter (± 288) 1.00
babelify-only 668480 ns/iter (± 1240) 676163 ns/iter (± 828) 0.99
parse_and_babelify_angular 43349574 ns/iter (± 1315125) 44628834 ns/iter (± 468735) 0.97
parse_and_babelify_backbone 5534749 ns/iter (± 51141) 5634092 ns/iter (± 44989) 0.98
parse_and_babelify_jquery 32703170 ns/iter (± 358836) 32428219 ns/iter (± 418705) 1.01
parse_and_babelify_jquery_mobile 55584426 ns/iter (± 689644) 55010668 ns/iter (± 580278) 1.01
parse_and_babelify_mootools 33746252 ns/iter (± 512200) 34147215 ns/iter (± 467890) 0.99
parse_and_babelify_underscore 4435783 ns/iter (± 29279) 4436841 ns/iter (± 21570) 1.00
parse_and_babelify_yui 33273982 ns/iter (± 555197) 33379805 ns/iter (± 300786) 1.00
html/minify/document/css_spec 42864686 ns/iter (± 199383) 43047686 ns/iter (± 544861) 1.00
html/minify/document/github 17588194 ns/iter (± 75210) 17782032 ns/iter (± 46362) 0.99
html/minify/document/stackoverflow 15796361 ns/iter (± 61913) 15886538 ns/iter (± 44806) 0.99
html/minify/document_fragment/css_spec 41416868 ns/iter (± 282267) 41153278 ns/iter (± 223066) 1.01
html/minify/document_fragment/github 16923016 ns/iter (± 44211) 16932161 ns/iter (± 99577) 1.00
html/minify/document_fragment/stackoverflow 15319264 ns/iter (± 64960) 15353485 ns/iter (± 43848) 1.00
html/document/visitor/compare/clone 341277 ns/iter (± 2185) 342208 ns/iter (± 1845) 1.00
html/document/visitor/compare/visit_mut_span 365323 ns/iter (± 1725) 363535 ns/iter (± 1694) 1.00
html/document/visitor/compare/visit_mut_span_panic 374763 ns/iter (± 2095) 368957 ns/iter (± 2045) 1.02
html/document/visitor/compare/fold_span 407684 ns/iter (± 1248) 404997 ns/iter (± 2474) 1.01
html/document/visitor/compare/fold_span_panic 463076 ns/iter (± 1662) 463975 ns/iter (± 2696) 1.00
html/document_fragment/visitor/compare/clone 342000 ns/iter (± 1968) 340572 ns/iter (± 3476) 1.00
html/document_fragment/visitor/compare/visit_mut_span 360014 ns/iter (± 2136) 367229 ns/iter (± 2476) 0.98
html/document_fragment/visitor/compare/visit_mut_span_panic 373768 ns/iter (± 1743) 374562 ns/iter (± 1917) 1.00
html/document_fragment/visitor/compare/fold_span 407672 ns/iter (± 2351) 401761 ns/iter (± 2436) 1.01
html/document_fragment/visitor/compare/fold_span_panic 459946 ns/iter (± 2138) 462078 ns/iter (± 2219) 1.00
html/lexer/css_2021_spec 15584067 ns/iter (± 9908) 15607143 ns/iter (± 71752) 1.00
html/lexer/github_com_17_05_2022 6020945 ns/iter (± 2742) 6054371 ns/iter (± 5014) 0.99
html/lexer/stackoverflow_com_17_05_2022 5656944 ns/iter (± 1363) 5669371 ns/iter (± 3381) 1.00
html/parser/parser_document/css_2021_spec 26022467 ns/iter (± 315476) 25836829 ns/iter (± 117726) 1.01
html/parser/parser_document/github_com_17_05_2022 8711997 ns/iter (± 4866) 8751134 ns/iter (± 5950) 1.00
html/parser/parser_document/stackoverflow_com_17_05_2022 7713372 ns/iter (± 21491) 7762600 ns/iter (± 23709) 0.99
html/parser/parser_document_fragment/css_2021_spec 26109425 ns/iter (± 299271) 26043026 ns/iter (± 215079) 1.00
html/parser/parser_document_fragment/github_com_17_05_2022 8752755 ns/iter (± 12880) 8786558 ns/iter (± 12606) 1.00
html/parser/parser_document_fragment/stackoverflow_com_17_05_2022 7731381 ns/iter (± 6368) 7720493 ns/iter (± 4977) 1.00

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

Please sign in to comment.