Skip to content

Commit 9512ea3

Browse files
authoredJun 29, 2023
feat(plugin/runner): Share runtime Engine (#7590)
1 parent ed9a4ae commit 9512ea3

File tree

3 files changed

+50
-36
lines changed

3 files changed

+50
-36
lines changed
 

‎crates/swc_plugin_runner/src/cache.rs

+5-4
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,9 @@ use wasmer::{Module, Store};
1919
#[cfg(all(not(target_arch = "wasm32"), feature = "filesystem_cache"))]
2020
use wasmer_cache::{Cache as WasmerCache, FileSystemCache, Hash};
2121

22-
use crate::plugin_module_bytes::{
23-
CompiledPluginModuleBytes, PluginModuleBytes, RawPluginModuleBytes,
22+
use crate::{
23+
plugin_module_bytes::{CompiledPluginModuleBytes, PluginModuleBytes, RawPluginModuleBytes},
24+
wasix_runtime::new_store,
2425
};
2526

2627
/// Version for bytecode cache stored in local filesystem.
@@ -114,7 +115,7 @@ impl PluginModuleCacheInner {
114115
// If FilesystemCache is available, store serialized bytes into fs.
115116
if let Some(fs_cache_store) = &mut self.fs_cache_store {
116117
let module_bytes_hash = Hash::generate(&raw_module_bytes);
117-
let store = crate::plugin_module_bytes::new_store();
118+
let store = new_store();
118119
let module = Module::new(&store, raw_module_bytes.clone())
119120
.context("Cannot compile plugin binary")?;
120121
fs_cache_store.store(module_bytes_hash, &module)?;
@@ -154,7 +155,7 @@ impl PluginModuleCacheInner {
154155
#[cfg(all(not(target_arch = "wasm32"), feature = "filesystem_cache"))]
155156
if let Some(fs_cache_store) = &self.fs_cache_store {
156157
let hash = self.fs_cache_hash_store.get(key)?;
157-
let store = crate::plugin_module_bytes::new_store();
158+
let store = new_store();
158159
let module = unsafe { fs_cache_store.load(&store, *hash) };
159160
if let Ok(module) = module {
160161
return Some(Box::new(CompiledPluginModuleBytes::new(

‎crates/swc_plugin_runner/src/plugin_module_bytes.rs

+1-30
Original file line numberDiff line numberDiff line change
@@ -2,36 +2,7 @@ use anyhow::Error;
22
use serde::{Deserialize, Serialize};
33
use wasmer::{Module, Store};
44

5-
/// Creates an instnace of [Store].
6-
///
7-
/// This function exists because we need to disable simd.
8-
#[cfg(not(target_arch = "wasm32"))]
9-
#[allow(unused_mut)]
10-
pub(crate) fn new_store() -> Store {
11-
// Use empty enumset to disable simd.
12-
use enumset::EnumSet;
13-
use wasmer::{BaseTunables, CompilerConfig, EngineBuilder, Target, Triple};
14-
let mut set = EnumSet::new();
15-
16-
// [TODO]: Should we use is_x86_feature_detected! macro instead?
17-
#[cfg(target_arch = "x86_64")]
18-
set.insert(wasmer::CpuFeature::SSE2);
19-
let target = Target::new(Triple::host(), set);
20-
21-
let config = wasmer_compiler_cranelift::Cranelift::default();
22-
let mut engine = EngineBuilder::new(Box::new(config) as Box<dyn CompilerConfig>)
23-
.set_target(Some(target))
24-
.engine();
25-
let tunables = BaseTunables::for_target(engine.target());
26-
engine.set_tunables(tunables);
27-
28-
Store::new(engine)
29-
}
30-
31-
#[cfg(target_arch = "wasm32")]
32-
fn new_store() -> Store {
33-
Store::default()
34-
}
5+
use crate::wasix_runtime::new_store;
356

367
// A trait abstracts plugin's wasm compilation and instantiation.
378
// Depends on the caller, this could be a simple clone from existing module, or

‎crates/swc_plugin_runner/src/wasix_runtime.rs

+44-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,36 @@
11
use std::{path::PathBuf, sync::Arc};
22

3+
use parking_lot::Mutex;
4+
use swc_common::sync::{Lazy, OnceCell};
5+
use wasmer::Store;
36
use wasmer_wasix::Runtime;
47

8+
/// A shared instance to plugin runtime engine.
9+
/// ref: https://github.com/wasmerio/wasmer/issues/3793#issuecomment-1607117480
10+
static ENGINE: Lazy<Mutex<wasmer::Engine>> = Lazy::new(|| {
11+
// Use empty enumset to disable simd.
12+
use enumset::EnumSet;
13+
use wasmer::{BaseTunables, CompilerConfig, EngineBuilder, Target, Triple};
14+
let mut set = EnumSet::new();
15+
16+
// [TODO]: Should we use is_x86_feature_detected! macro instead?
17+
#[cfg(target_arch = "x86_64")]
18+
set.insert(wasmer::CpuFeature::SSE2);
19+
let target = Target::new(Triple::host(), set);
20+
21+
let config = wasmer_compiler_cranelift::Cranelift::default();
22+
let mut engine = EngineBuilder::new(Box::new(config) as Box<dyn CompilerConfig>)
23+
.set_target(Some(target))
24+
.engine();
25+
let tunables = BaseTunables::for_target(engine.target());
26+
engine.set_tunables(tunables);
27+
parking_lot::Mutex::new(wasmer::Engine::from(engine))
28+
});
29+
30+
/// Dummy http client for wasix runtime to avoid instantiation failure for the
31+
/// default pluggable runtime. We don't support network in the host runtime
32+
/// anyway (we init vnet instead), and for the default runtime mostly it's for
33+
/// the wapm registry which is redundant for the plugin.
534
#[derive(Debug)]
635
struct StubHttpClient;
736

@@ -38,11 +67,10 @@ pub fn build_wasi_runtime(
3867
SharedCache::default().with_fallback(wasmer_wasix::runtime::module_cache::in_memory());
3968

4069
let dummy_loader = BuiltinPackageLoader::new_with_client(".", Arc::new(StubHttpClient));
41-
4270
let rt = PluggableRuntime {
4371
rt: Arc::new(TokioTaskManager::shared()),
4472
networking: Arc::new(virtual_net::UnsupportedVirtualNetworking::default()),
45-
engine: Some(wasmer::Engine::default()),
73+
engine: Some(ENGINE.lock().clone()),
4674
tty: None,
4775
source: Arc::new(MultiSource::new()),
4876
module_cache: Arc::new(cache),
@@ -52,3 +80,17 @@ pub fn build_wasi_runtime(
5280

5381
Some(Arc::new(rt))
5482
}
83+
84+
/// Creates an instnace of [Store] with custom engine instead of default one to
85+
/// disable simd for certain platform targets
86+
#[cfg(not(target_arch = "wasm32"))]
87+
#[allow(unused_mut)]
88+
pub(crate) fn new_store() -> Store {
89+
let engine = ENGINE.lock().clone();
90+
Store::new(engine)
91+
}
92+
93+
#[cfg(target_arch = "wasm32")]
94+
pub(crate) fn new_store() -> Store {
95+
Store::default()
96+
}

1 commit comments

Comments
 (1)

github-actions[bot] commented on Jun 29, 2023

@github-actions[bot]

Benchmark

Benchmark suite Current: 9512ea3 Previous: a685c88 Ratio
es/full/bugs-1 301484 ns/iter (± 7405) 300702 ns/iter (± 8072) 1.00
es/full/minify/libraries/antd 1542879047 ns/iter (± 26466497) 1530196337 ns/iter (± 39606913) 1.01
es/full/minify/libraries/d3 328910822 ns/iter (± 8290322) 318782444 ns/iter (± 2503228) 1.03
es/full/minify/libraries/echarts 1231035870 ns/iter (± 14997263) 1228113006 ns/iter (± 12381029) 1.00
es/full/minify/libraries/jquery 96276766 ns/iter (± 291053) 96786725 ns/iter (± 590829) 0.99
es/full/minify/libraries/lodash 113841302 ns/iter (± 1119351) 114518606 ns/iter (± 630420) 0.99
es/full/minify/libraries/moment 56230672 ns/iter (± 139983) 56657606 ns/iter (± 116633) 0.99
es/full/minify/libraries/react 20175550 ns/iter (± 152604) 20296876 ns/iter (± 55812) 0.99
es/full/minify/libraries/terser 249975120 ns/iter (± 1713091) 250535579 ns/iter (± 1795928) 1.00
es/full/minify/libraries/three 449198375 ns/iter (± 5351848) 449169366 ns/iter (± 6666408) 1.00
es/full/minify/libraries/typescript 3037955754 ns/iter (± 29120474) 3052065120 ns/iter (± 29510280) 1.00
es/full/minify/libraries/victory 661928578 ns/iter (± 19129491) 655212785 ns/iter (± 5814990) 1.01
es/full/minify/libraries/vue 139447943 ns/iter (± 750211) 140222410 ns/iter (± 628938) 0.99
es/full/codegen/es3 37078 ns/iter (± 464) 38057 ns/iter (± 148) 0.97
es/full/codegen/es5 36875 ns/iter (± 64) 38104 ns/iter (± 387) 0.97
es/full/codegen/es2015 36898 ns/iter (± 52) 38066 ns/iter (± 104) 0.97
es/full/codegen/es2016 36991 ns/iter (± 110) 38098 ns/iter (± 84) 0.97
es/full/codegen/es2017 36972 ns/iter (± 140) 38092 ns/iter (± 266) 0.97
es/full/codegen/es2018 36945 ns/iter (± 124) 38021 ns/iter (± 121) 0.97
es/full/codegen/es2019 37001 ns/iter (± 97) 38038 ns/iter (± 66) 0.97
es/full/codegen/es2020 36959 ns/iter (± 132) 38208 ns/iter (± 115) 0.97
es/full/all/es3 180930958 ns/iter (± 966183) 178271750 ns/iter (± 812864) 1.01
es/full/all/es5 172875839 ns/iter (± 458465) 169887196 ns/iter (± 628434) 1.02
es/full/all/es2015 128940037 ns/iter (± 637148) 126779085 ns/iter (± 902045) 1.02
es/full/all/es2016 126863279 ns/iter (± 1113460) 125819303 ns/iter (± 593737) 1.01
es/full/all/es2017 126453009 ns/iter (± 559656) 125055868 ns/iter (± 547228) 1.01
es/full/all/es2018 124288337 ns/iter (± 376281) 123010905 ns/iter (± 537055) 1.01
es/full/all/es2019 123742257 ns/iter (± 1034438) 122490780 ns/iter (± 878266) 1.01
es/full/all/es2020 118538461 ns/iter (± 551841) 117852307 ns/iter (± 343535) 1.01
es/full/parser 520110 ns/iter (± 7412) 510294 ns/iter (± 8552) 1.02
es/full/base/fixer 18744 ns/iter (± 64) 19659 ns/iter (± 73) 0.95
es/full/base/resolver_and_hygiene 96183 ns/iter (± 171) 94089 ns/iter (± 141) 1.02
serialization of serde 307 ns/iter (± 1) 309 ns/iter (± 5) 0.99
css/minify/libraries/bootstrap 31562306 ns/iter (± 1269567) 31020882 ns/iter (± 437350) 1.02
css/visitor/compare/clone 2145694 ns/iter (± 44876) 2007259 ns/iter (± 22672) 1.07
css/visitor/compare/visit_mut_span 2268749 ns/iter (± 13211) 2150211 ns/iter (± 23631) 1.06
css/visitor/compare/visit_mut_span_panic 2333195 ns/iter (± 33066) 2206453 ns/iter (± 35189) 1.06
css/visitor/compare/fold_span 3023631 ns/iter (± 39541) 2869947 ns/iter (± 18222) 1.05
css/visitor/compare/fold_span_panic 3285750 ns/iter (± 110749) 3116746 ns/iter (± 22477) 1.05
css/lexer/bootstrap_5_1_3 4738506 ns/iter (± 2319) 4777703 ns/iter (± 5218) 0.99
css/lexer/foundation_6_7_4 4001515 ns/iter (± 2780) 4030557 ns/iter (± 3285) 0.99
css/lexer/tailwind_3_1_1 762135 ns/iter (± 1260) 765872 ns/iter (± 374) 1.00
css/parser/bootstrap_5_1_3 20684033 ns/iter (± 109349) 20547287 ns/iter (± 111827) 1.01
css/parser/foundation_6_7_4 16658097 ns/iter (± 34723) 16563419 ns/iter (± 75426) 1.01
css/parser/tailwind_3_1_1 3205250 ns/iter (± 5357) 3192170 ns/iter (± 3567) 1.00
es/codegen/colors 742041 ns/iter (± 407056) 746003 ns/iter (± 405666) 0.99
es/codegen/large 2985776 ns/iter (± 1569819) 2983601 ns/iter (± 1560344) 1.00
es/codegen/with-parser/colors 48552 ns/iter (± 2629) 48211 ns/iter (± 212) 1.01
es/codegen/with-parser/large 513314 ns/iter (± 708) 514873 ns/iter (± 1469) 1.00
es/minify/libraries/antd 1330537297 ns/iter (± 8979238) 1325979134 ns/iter (± 16206970) 1.00
es/minify/libraries/d3 280563972 ns/iter (± 3170013) 281602137 ns/iter (± 3249203) 1.00
es/minify/libraries/echarts 1068253951 ns/iter (± 16584168) 1074196803 ns/iter (± 26813959) 0.99
es/minify/libraries/jquery 84391971 ns/iter (± 756244) 84191798 ns/iter (± 181218) 1.00
es/minify/libraries/lodash 102625997 ns/iter (± 888091) 103099452 ns/iter (± 226398) 1.00
es/minify/libraries/moment 49502704 ns/iter (± 148137) 49621633 ns/iter (± 159098) 1.00
es/minify/libraries/react 18044058 ns/iter (± 176720) 18034840 ns/iter (± 63836) 1.00
es/minify/libraries/terser 215597555 ns/iter (± 2742866) 219824527 ns/iter (± 4320027) 0.98
es/minify/libraries/three 375381578 ns/iter (± 7346464) 375602734 ns/iter (± 7853268) 1.00
es/minify/libraries/typescript 2624099741 ns/iter (± 24345204) 2613548883 ns/iter (± 17019010) 1.00
es/minify/libraries/victory 612719979 ns/iter (± 14653477) 581822503 ns/iter (± 16985063) 1.05
es/minify/libraries/vue 126415460 ns/iter (± 1742952) 124354603 ns/iter (± 556986) 1.02
es/visitor/compare/clone 2055310 ns/iter (± 4349) 2049493 ns/iter (± 5958) 1.00
es/visitor/compare/visit_mut_span 2378015 ns/iter (± 3723) 2356426 ns/iter (± 10853) 1.01
es/visitor/compare/visit_mut_span_panic 2431453 ns/iter (± 1797) 2434454 ns/iter (± 13063) 1.00
es/visitor/compare/fold_span 3466241 ns/iter (± 6172) 3468974 ns/iter (± 5913) 1.00
es/visitor/compare/fold_span_panic 3595154 ns/iter (± 12565) 3602051 ns/iter (± 4743) 1.00
es/lexer/colors 13235 ns/iter (± 872) 13226 ns/iter (± 16) 1.00
es/lexer/angular 6285468 ns/iter (± 7034) 6256129 ns/iter (± 25227) 1.00
es/lexer/backbone 827705 ns/iter (± 901) 818320 ns/iter (± 1412) 1.01
es/lexer/jquery 4651942 ns/iter (± 4688) 4625582 ns/iter (± 7431) 1.01
es/lexer/jquery mobile 7135336 ns/iter (± 8820) 7094991 ns/iter (± 7579) 1.01
es/lexer/mootools 3678682 ns/iter (± 1141) 3633958 ns/iter (± 4437) 1.01
es/lexer/underscore 690898 ns/iter (± 1567) 684868 ns/iter (± 1422) 1.01
es/lexer/three 21807370 ns/iter (± 22826) 21574940 ns/iter (± 10498) 1.01
es/lexer/yui 4151371 ns/iter (± 2369) 4086774 ns/iter (± 4970) 1.02
es/parser/colors 29011 ns/iter (± 44) 29359 ns/iter (± 68) 0.99
es/parser/angular 14436415 ns/iter (± 152085) 14995343 ns/iter (± 285657) 0.96
es/parser/backbone 2153766 ns/iter (± 10537) 2149494 ns/iter (± 11679) 1.00
es/parser/jquery 11848971 ns/iter (± 116605) 11730011 ns/iter (± 51692) 1.01
es/parser/jquery mobile 18035082 ns/iter (± 247690) 17937253 ns/iter (± 111199) 1.01
es/parser/mootools 8958602 ns/iter (± 26112) 8961230 ns/iter (± 18993) 1.00
es/parser/underscore 1856887 ns/iter (± 10111) 1859743 ns/iter (± 9034) 1.00
es/parser/three 51267405 ns/iter (± 1147378) 50950144 ns/iter (± 374973) 1.01
es/parser/yui 8993576 ns/iter (± 43846) 9019260 ns/iter (± 48751) 1.00
es/preset-env/usage/builtin_type 142751 ns/iter (± 33350) 142274 ns/iter (± 33045) 1.00
es/preset-env/usage/property 18361 ns/iter (± 73) 18402 ns/iter (± 70) 1.00
es/resolver/typescript 95932135 ns/iter (± 1765996) 95613837 ns/iter (± 1582665) 1.00
es/fixer/typescript 67412824 ns/iter (± 510174) 67506786 ns/iter (± 1353675) 1.00
es/hygiene/typescript 146767004 ns/iter (± 2642632) 147645506 ns/iter (± 2943625) 0.99
es/resolver_with_hygiene/typescript 307557023 ns/iter (± 2265796) 305987153 ns/iter (± 4182608) 1.01
es/visitor/base-perf/module_clone 61431 ns/iter (± 254) 61273 ns/iter (± 225) 1.00
es/visitor/base-perf/fold_empty 64412 ns/iter (± 309) 64901 ns/iter (± 302) 0.99
es/visitor/base-perf/fold_noop_impl_all 64578 ns/iter (± 310) 65309 ns/iter (± 284) 0.99
es/visitor/base-perf/fold_noop_impl_vec 64858 ns/iter (± 234) 65418 ns/iter (± 277) 0.99
es/visitor/base-perf/boxing_boxed_clone 56 ns/iter (± 0) 57 ns/iter (± 0) 0.98
es/visitor/base-perf/boxing_unboxed_clone 39 ns/iter (± 0) 40 ns/iter (± 0) 0.97
es/visitor/base-perf/boxing_boxed 113 ns/iter (± 0) 113 ns/iter (± 0) 1
es/visitor/base-perf/boxing_unboxed 79 ns/iter (± 0) 80 ns/iter (± 0) 0.99
es/visitor/base-perf/visit_empty 0 ns/iter (± 0) 0 ns/iter (± 0) NaN
es/visitor/base-perf/visit_contains_this 2665 ns/iter (± 13) 2642 ns/iter (± 16) 1.01
es/base/parallel/resolver/typescript 4443630882 ns/iter (± 236312367) 4533905625 ns/iter (± 216622800) 0.98
es/base/parallel/hygiene/typescript 1597132238 ns/iter (± 12722732) 1605815548 ns/iter (± 21258358) 0.99
misc/visitors/time-complexity/time 5 110 ns/iter (± 0) 105 ns/iter (± 0) 1.05
misc/visitors/time-complexity/time 10 311 ns/iter (± 0) 311 ns/iter (± 0) 1
misc/visitors/time-complexity/time 15 617 ns/iter (± 6) 531 ns/iter (± 3) 1.16
misc/visitors/time-complexity/time 20 943 ns/iter (± 4) 1096 ns/iter (± 3) 0.86
misc/visitors/time-complexity/time 40 3725 ns/iter (± 12) 3727 ns/iter (± 9) 1.00
misc/visitors/time-complexity/time 60 7698 ns/iter (± 11) 7734 ns/iter (± 21) 1.00
es/full-target/es2016 239780 ns/iter (± 692) 238816 ns/iter (± 1108) 1.00
es/full-target/es2017 226949 ns/iter (± 344) 229267 ns/iter (± 1079) 0.99
es/full-target/es2018 215537 ns/iter (± 689) 215547 ns/iter (± 961) 1.00
es2020_nullish_coalescing 72777 ns/iter (± 631) 72725 ns/iter (± 314) 1.00
es2020_optional_chaining 84344 ns/iter (± 345) 84058 ns/iter (± 299) 1.00
es2022_class_properties 121081 ns/iter (± 485) 121082 ns/iter (± 332) 1.00
es2018_object_rest_spread 77405 ns/iter (± 224) 76662 ns/iter (± 223) 1.01
es2019_optional_catch_binding 66525 ns/iter (± 277) 66271 ns/iter (± 183) 1.00
es2017_async_to_generator 65005 ns/iter (± 452) 64746 ns/iter (± 189) 1.00
es2016_exponentiation 70956 ns/iter (± 181) 69971 ns/iter (± 216) 1.01
es2015_arrow 74582 ns/iter (± 250) 73335 ns/iter (± 320) 1.02
es2015_block_scoped_fn 70160 ns/iter (± 266) 69868 ns/iter (± 220) 1.00
es2015_block_scoping 135491 ns/iter (± 511) 132302 ns/iter (± 538) 1.02

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

Please sign in to comment.