Skip to content

Commit

Permalink
feat(plugin/runner): Enable in-memory precompiled module cache (#7420)
Browse files Browse the repository at this point in the history
  • Loading branch information
kwonoj committed May 20, 2023
1 parent 0ac3aeb commit f8fe365
Showing 1 changed file with 22 additions and 15 deletions.
37 changes: 22 additions & 15 deletions crates/swc_plugin_runner/src/cache.rs
Original file line number Diff line number Diff line change
Expand Up @@ -44,17 +44,9 @@ pub struct PluginModuleCacheInner {
fs_cache_hash_store: AHashMap<String, Hash>,
// Generic in-memory cache to the raw bytes, either read by fs or supplied by bindgen.
memory_cache_store: AHashMap<String, Vec<u8>>,
/*
A naive hashmap to the compiled plugin modules.
Current it doesn't have any invalidation or expiration logics like lru,
having a lot of plugins may create some memory pressure.
[TODO]: This is currently disabled, since on the latest wasmer@3 subsequent
plugin load via in memory module causes intermittent heap_get_oob when
host tries to allocate memory inside of the guest.
Current guess is memory instance is being corrupted by the previous run, but
until figure out root cause & fix will only use fs_cache directly.
*/
// A naive hashmap to the compiled plugin modules.
// Current it doesn't have any invalidation or expiration logics like lru,
// having a lot of plugins may create some memory pressure.
compiled_module_bytes: AHashMap<String, (wasmer::Store, wasmer::Module)>,
}

Expand All @@ -75,11 +67,27 @@ impl PluginModuleCacheInner {
is_in_cache
}

/// Insert raw plugin module bytes into cache does not have compiled
/// wasmer::Module. The bytes stored in this type of cache will return
/// RawPluginModuleBytes. It is strongly recommend to avoid using this
/// type of cache as much as possible, since module compilation time for
/// the wasm is noticeably expensive and caching raw bytes only cuts off
/// the reading time for the plugin module.
pub fn insert_raw_bytes(&mut self, key: String, value: Vec<u8>) {
self.memory_cache_store.insert(key, value);
}

fn insert_compiled_module_bytes(
/// Insert already compiled wasmer::Module into cache.
/// The module stored in this cache will return CompiledPluginModuleBytes,
/// which costs near-zero time when calling its `compile_module` method as
/// it clones precompiled module directly.
///
/// In genearl it is recommended to use either using filesystemcache
/// `store_bytes_from_path` which internally calls this or directly call
/// this to store compiled module bytes. CompiledModuleBytes provides way to
/// create it via RawModuleBytes, so there's no practical reason to
/// store raw bytes most cases.
pub fn insert_compiled_module_bytes(
&mut self,
key: String,
value: (wasmer::Store, wasmer::Module),
Expand All @@ -106,9 +114,8 @@ impl PluginModuleCacheInner {
self.fs_cache_hash_store
.insert(key.to_string(), module_bytes_hash);

// [TODO]: reenable this
// self.insert_compiled_module_bytes(key.to_string(), (store,
// module));
// Also store in memory for the in-process cache.
self.insert_compiled_module_bytes(key.to_string(), (store, module));
}

// Store raw bytes into memory cache.
Expand Down

1 comment on commit f8fe365

@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: f8fe365 Previous: 40d2bf7 Ratio
es/full/bugs-1 302452 ns/iter (± 6309) 312468 ns/iter (± 7918) 0.97
es/full/minify/libraries/antd 1536000724 ns/iter (± 50043402) 1701519117 ns/iter (± 42460614) 0.90
es/full/minify/libraries/d3 340052497 ns/iter (± 15358878) 331674758 ns/iter (± 17644945) 1.03
es/full/minify/libraries/echarts 1308856788 ns/iter (± 48455110) 1337115281 ns/iter (± 24978769) 0.98
es/full/minify/libraries/jquery 99934621 ns/iter (± 3929112) 101785867 ns/iter (± 3228935) 0.98
es/full/minify/libraries/lodash 106846184 ns/iter (± 4779092) 113597393 ns/iter (± 3660953) 0.94
es/full/minify/libraries/moment 53013554 ns/iter (± 305719) 57017021 ns/iter (± 1312052) 0.93
es/full/minify/libraries/react 20178562 ns/iter (± 486797) 20575234 ns/iter (± 487237) 0.98
es/full/minify/libraries/terser 276056052 ns/iter (± 12893247) 273515513 ns/iter (± 18875061) 1.01
es/full/minify/libraries/three 484009078 ns/iter (± 12261810) 478847190 ns/iter (± 24906070) 1.01
es/full/minify/libraries/typescript 2958529349 ns/iter (± 94405840) 3175671018 ns/iter (± 37968863) 0.93
es/full/minify/libraries/victory 720039933 ns/iter (± 28652347) 721155251 ns/iter (± 35121463) 1.00
es/full/minify/libraries/vue 145381148 ns/iter (± 5747170) 147448021 ns/iter (± 7144817) 0.99
es/full/codegen/es3 33422 ns/iter (± 67) 34145 ns/iter (± 141) 0.98
es/full/codegen/es5 33480 ns/iter (± 78) 34170 ns/iter (± 79) 0.98
es/full/codegen/es2015 33490 ns/iter (± 73) 34196 ns/iter (± 60) 0.98
es/full/codegen/es2016 33481 ns/iter (± 56) 34250 ns/iter (± 38) 0.98
es/full/codegen/es2017 33434 ns/iter (± 80) 34177 ns/iter (± 62) 0.98
es/full/codegen/es2018 33502 ns/iter (± 28) 34170 ns/iter (± 54) 0.98
es/full/codegen/es2019 33497 ns/iter (± 55) 34088 ns/iter (± 43) 0.98
es/full/codegen/es2020 33491 ns/iter (± 79) 34134 ns/iter (± 39) 0.98
es/full/all/es3 180073957 ns/iter (± 3620581) 182326995 ns/iter (± 5337277) 0.99
es/full/all/es5 174777212 ns/iter (± 4064080) 176086616 ns/iter (± 3037878) 0.99
es/full/all/es2015 137081118 ns/iter (± 1230994) 142860188 ns/iter (± 2665710) 0.96
es/full/all/es2016 135142243 ns/iter (± 1814260) 137983144 ns/iter (± 3702390) 0.98
es/full/all/es2017 129101587 ns/iter (± 2060725) 136009286 ns/iter (± 2098316) 0.95
es/full/all/es2018 125165938 ns/iter (± 1271878) 132677255 ns/iter (± 2544637) 0.94
es/full/all/es2019 127637718 ns/iter (± 2458126) 131592145 ns/iter (± 2074315) 0.97
es/full/all/es2020 119762284 ns/iter (± 1515273) 120841903 ns/iter (± 1166349) 0.99
es/full/parser 521431 ns/iter (± 10700) 527121 ns/iter (± 12365) 0.99
es/full/base/fixer 22625 ns/iter (± 24) 22289 ns/iter (± 22) 1.02
es/full/base/resolver_and_hygiene 85159 ns/iter (± 100) 85259 ns/iter (± 100) 1.00
serialization of serde 123 ns/iter (± 0) 123 ns/iter (± 0) 1
css/minify/libraries/bootstrap 28664676 ns/iter (± 776003) 27806495 ns/iter (± 900161) 1.03
css/visitor/compare/clone 2224860 ns/iter (± 45202) 2208629 ns/iter (± 55509) 1.01
css/visitor/compare/visit_mut_span 2410560 ns/iter (± 78943) 2401006 ns/iter (± 65671) 1.00
css/visitor/compare/visit_mut_span_panic 2354620 ns/iter (± 34127) 2387488 ns/iter (± 68439) 0.99
css/visitor/compare/fold_span 3093154 ns/iter (± 64692) 3233713 ns/iter (± 91681) 0.96
css/visitor/compare/fold_span_panic 3407013 ns/iter (± 51051) 3294066 ns/iter (± 94440) 1.03
css/lexer/bootstrap_5_1_3 5172480 ns/iter (± 12111) 5170924 ns/iter (± 13598) 1.00
css/lexer/foundation_6_7_4 4358925 ns/iter (± 1592) 4354906 ns/iter (± 3140) 1.00
css/lexer/tailwind_3_1_1 826191 ns/iter (± 420) 826033 ns/iter (± 264) 1.00
css/parser/bootstrap_5_1_3 20901136 ns/iter (± 273158) 21704401 ns/iter (± 409361) 0.96
css/parser/foundation_6_7_4 16685383 ns/iter (± 337865) 17216907 ns/iter (± 359521) 0.97
css/parser/tailwind_3_1_1 3235123 ns/iter (± 6494) 3246791 ns/iter (± 5155) 1.00
es/codegen/colors 731473 ns/iter (± 395841) 731476 ns/iter (± 396063) 1.00
es/codegen/large 3171646 ns/iter (± 1681715) 3129187 ns/iter (± 1685084) 1.01
es/codegen/with-parser/colors 48427 ns/iter (± 548) 48443 ns/iter (± 245) 1.00
es/codegen/with-parser/large 510493 ns/iter (± 1815) 510679 ns/iter (± 1079) 1.00
es/minify/libraries/antd 1334695618 ns/iter (± 66590498) 1494323458 ns/iter (± 45439344) 0.89
es/minify/libraries/d3 293314767 ns/iter (± 15451895) 288459935 ns/iter (± 18951387) 1.02
es/minify/libraries/echarts 1137305041 ns/iter (± 54834848) 1138055140 ns/iter (± 40224766) 1.00
es/minify/libraries/jquery 88108620 ns/iter (± 2358006) 87188991 ns/iter (± 2561883) 1.01
es/minify/libraries/lodash 98060902 ns/iter (± 1940991) 103478120 ns/iter (± 3792028) 0.95
es/minify/libraries/moment 49212074 ns/iter (± 1589861) 48393976 ns/iter (± 1779211) 1.02
es/minify/libraries/react 18457020 ns/iter (± 377183) 17943353 ns/iter (± 524288) 1.03
es/minify/libraries/terser 243183294 ns/iter (± 7086235) 241590982 ns/iter (± 14912997) 1.01
es/minify/libraries/three 415304771 ns/iter (± 23033517) 422330280 ns/iter (± 23181414) 0.98
es/minify/libraries/typescript 2533786310 ns/iter (± 79446762) 2507001061 ns/iter (± 13581153) 1.01
es/minify/libraries/victory 633710619 ns/iter (± 37326548) 537495068 ns/iter (± 10948185) 1.18
es/minify/libraries/vue 130911879 ns/iter (± 5768125) 119345225 ns/iter (± 805801) 1.10
es/visitor/compare/clone 2430684 ns/iter (± 30130) 2321294 ns/iter (± 81442) 1.05
es/visitor/compare/visit_mut_span 2695064 ns/iter (± 31396) 2680401 ns/iter (± 6388) 1.01
es/visitor/compare/visit_mut_span_panic 2738279 ns/iter (± 61020) 2746715 ns/iter (± 7355) 1.00
es/visitor/compare/fold_span 4012325 ns/iter (± 73698) 3804914 ns/iter (± 7592) 1.05
es/visitor/compare/fold_span_panic 4154050 ns/iter (± 75150) 3921187 ns/iter (± 5153) 1.06
es/lexer/colors 13102 ns/iter (± 16) 13081 ns/iter (± 8) 1.00
es/lexer/angular 6421816 ns/iter (± 7786) 6397008 ns/iter (± 1943) 1.00
es/lexer/backbone 792089 ns/iter (± 598) 791671 ns/iter (± 616) 1.00
es/lexer/jquery 4463784 ns/iter (± 2300) 4448865 ns/iter (± 4338) 1.00
es/lexer/jquery mobile 6939533 ns/iter (± 6448) 6906282 ns/iter (± 3663) 1.00
es/lexer/mootools 3492514 ns/iter (± 1853) 3478852 ns/iter (± 4205) 1.00
es/lexer/underscore 657295 ns/iter (± 338) 654321 ns/iter (± 147) 1.00
es/lexer/three 21042675 ns/iter (± 43255) 20976855 ns/iter (± 7888) 1.00
es/lexer/yui 3879288 ns/iter (± 1603) 3867696 ns/iter (± 4999) 1.00
es/parser/colors 28709 ns/iter (± 47) 29019 ns/iter (± 115) 0.99
es/parser/angular 16158197 ns/iter (± 380695) 14941498 ns/iter (± 111971) 1.08
es/parser/backbone 2177398 ns/iter (± 17779) 2161024 ns/iter (± 17049) 1.01
es/parser/jquery 12547185 ns/iter (± 565148) 11759426 ns/iter (± 68503) 1.07
es/parser/jquery mobile 20297668 ns/iter (± 719086) 18248433 ns/iter (± 134581) 1.11
es/parser/mootools 9064769 ns/iter (± 205076) 8948873 ns/iter (± 37818) 1.01
es/parser/underscore 1827364 ns/iter (± 10726) 1834720 ns/iter (± 12966) 1.00
es/parser/three 56545985 ns/iter (± 858751) 51940694 ns/iter (± 266897) 1.09
es/parser/yui 9580337 ns/iter (± 146446) 9038132 ns/iter (± 54326) 1.06
es/preset-env/usage/builtin_type 141323 ns/iter (± 34330) 140394 ns/iter (± 33898) 1.01
es/preset-env/usage/property 19748 ns/iter (± 114) 20184 ns/iter (± 66) 0.98
es/resolver/typescript 109306615 ns/iter (± 2492239) 110925829 ns/iter (± 2410977) 0.99
es/fixer/typescript 81209751 ns/iter (± 956811) 80445663 ns/iter (± 523080) 1.01
es/hygiene/typescript 175511208 ns/iter (± 5802369) 166873544 ns/iter (± 1282699) 1.05
es/resolver_with_hygiene/typescript 304502401 ns/iter (± 14257709) 305238467 ns/iter (± 2320948) 1.00
es/visitor/base-perf/module_clone 80919 ns/iter (± 381) 80583 ns/iter (± 312) 1.00
es/visitor/base-perf/fold_empty 90371 ns/iter (± 406) 90173 ns/iter (± 235) 1.00
es/visitor/base-perf/fold_noop_impl_all 91017 ns/iter (± 875) 89320 ns/iter (± 350) 1.02
es/visitor/base-perf/fold_noop_impl_vec 90883 ns/iter (± 298) 89570 ns/iter (± 369) 1.01
es/visitor/base-perf/boxing_boxed_clone 58 ns/iter (± 0) 56 ns/iter (± 0) 1.04
es/visitor/base-perf/boxing_unboxed_clone 42 ns/iter (± 0) 42 ns/iter (± 0) 1
es/visitor/base-perf/boxing_boxed 105 ns/iter (± 0) 103 ns/iter (± 0) 1.02
es/visitor/base-perf/boxing_unboxed 79 ns/iter (± 0) 78 ns/iter (± 0) 1.01
es/visitor/base-perf/visit_contains_this 3439 ns/iter (± 42) 3386 ns/iter (± 23) 1.02
es/base/parallel/resolver/typescript 5820947776 ns/iter (± 470268677) 5757257636 ns/iter (± 382224951) 1.01
es/base/parallel/hygiene/typescript 2072425070 ns/iter (± 31196608) 1967040321 ns/iter (± 28756349) 1.05
misc/visitors/time-complexity/time 5 105 ns/iter (± 0) 104 ns/iter (± 1) 1.01
misc/visitors/time-complexity/time 10 361 ns/iter (± 2) 351 ns/iter (± 1) 1.03
misc/visitors/time-complexity/time 15 710 ns/iter (± 0) 693 ns/iter (± 4) 1.02
misc/visitors/time-complexity/time 20 1326 ns/iter (± 2) 1292 ns/iter (± 12) 1.03
misc/visitors/time-complexity/time 40 7004 ns/iter (± 22) 6987 ns/iter (± 34) 1.00
misc/visitors/time-complexity/time 60 17870 ns/iter (± 25) 17544 ns/iter (± 145) 1.02
es/full-target/es2016 253787 ns/iter (± 1035) 253647 ns/iter (± 2599) 1.00
es/full-target/es2017 245641 ns/iter (± 471) 240464 ns/iter (± 1106) 1.02
es/full-target/es2018 235445 ns/iter (± 269) 229889 ns/iter (± 1606) 1.02
es2020_nullish_coalescing 93401 ns/iter (± 459) 90978 ns/iter (± 718) 1.03
es2020_optional_chaining 124983 ns/iter (± 130) 122600 ns/iter (± 943) 1.02
es2022_class_properties 149632 ns/iter (± 329) 147017 ns/iter (± 1049) 1.02
es2018_object_rest_spread 96105 ns/iter (± 189) 94249 ns/iter (± 774) 1.02
es2019_optional_catch_binding 85850 ns/iter (± 154) 84006 ns/iter (± 462) 1.02
es2017_async_to_generator 86326 ns/iter (± 173) 84450 ns/iter (± 587) 1.02
es2016_exponentiation 90853 ns/iter (± 195) 88437 ns/iter (± 741) 1.03
es2015_arrow 94068 ns/iter (± 266) 91822 ns/iter (± 689) 1.02
es2015_block_scoped_fn 92424 ns/iter (± 217) 89390 ns/iter (± 361) 1.03
es2015_block_scoping 170192 ns/iter (± 336) 164132 ns/iter (± 927) 1.04

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

Please sign in to comment.