From 36465c91bda74728240ab1c92284d4c48577c121 Mon Sep 17 00:00:00 2001 From: Hatter Jiang Date: Sun, 22 Jan 2023 21:57:42 +0800 Subject: [PATCH] feat: speed --- javascript-container/src/main.rs | 24 +++++++++++++++++++++--- javascript-engine/Cargo.toml | 5 +++++ 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/javascript-container/src/main.rs b/javascript-container/src/main.rs index 35f9010..9052f63 100644 --- a/javascript-container/src/main.rs +++ b/javascript-container/src/main.rs @@ -1,33 +1,49 @@ +use std::time::Instant; + use anyhow::Result; use wasmtime::{Config, Engine, Linker, Module, Store}; fn main() -> Result<()> { + let instant = Instant::now(); let config = Config::default(); let engine = Engine::new(&config).unwrap(); + println!("T1: {}ms", instant.elapsed().as_millis()); - let wasm_bytes = include_bytes!("/Users/hatterjiang/Code/hattergit/secure-javascript-container/javascript-engine/target/wasm32-unknown-unknown/debug/javascript_engine.wasm"); - let module = Module::new(&engine, wasm_bytes)?; + let wasm_bytes_release = include_bytes!("/Users/hatterjiang/Code/hattergit/secure-javascript-container/javascript-engine/target/wasm32-unknown-unknown/release/javascript_engine.wasm"); + let wasm_bytes_debug = include_bytes!("/Users/hatterjiang/Code/hattergit/secure-javascript-container/javascript-engine/target/wasm32-unknown-unknown/debug/javascript_engine.wasm"); + let is_release = std::env::var("RELEASE").unwrap_or_else(|_| "no".into()) == "yes"; + println!("T1.2: {}ms", instant.elapsed().as_millis()); + let module = Module::new(&engine, if is_release { &wasm_bytes_release[..] } else { &wasm_bytes_debug[..] })?; + println!("T2: {}ms", instant.elapsed().as_millis()); let linker = Linker::new(&engine); let mut store = Store::new(&engine, ()); + println!("T3: {}ms", instant.elapsed().as_millis()); let instance = linker.instantiate(&mut store, &module)?; + println!("T4: {}ms", instant.elapsed().as_millis()); let memory = instance.get_memory(&mut store, "memory").expect("SHOULD NOT HAPPEN"); let malloc = instance.get_typed_func::(&mut store, "malloc")?; let free = instance.get_typed_func::(&mut store, "free")?; let eval = instance.get_typed_func::(&mut store, "eval")?; + println!("T5: {}ms", instant.elapsed().as_millis()); - let js = "1+2"; + let js = std::env::var("JS").unwrap_or_else(|_| "1+1".into()); + println!("JS: {}", js); let js_bytes = js.as_bytes(); let js_bytes_len = js_bytes.len(); + println!("T5.1: {}ms", instant.elapsed().as_millis()); let ptr = malloc.call(&mut store, js.as_bytes().len() as i32)?; + println!("T5.2: {}ms", instant.elapsed().as_millis()); let memory_data_mut = memory.data_mut(&mut store); for i in 0..js_bytes_len { memory_data_mut[4 + ptr as usize + i] = js_bytes[i]; } + println!("T5.3: {}ms", instant.elapsed().as_millis()); let eval_result = eval.call(&mut store, ptr)?; println!("Eval result: {:?}", eval_result); + println!("T6: {}ms", instant.elapsed().as_millis()); let memory = instance.get_memory(&mut store, "memory").expect("SHOULD NOT HAPPEN"); let memory_data_mut = memory.data_mut(&mut store); @@ -44,6 +60,8 @@ fn main() -> Result<()> { } let ss = unsafe { String::from_utf8_unchecked(s) }; println!("Result: {}", ss); + free.call(&mut store, eval_result)?; + println!("T7: {}ms", instant.elapsed().as_millis()); Ok(()) } diff --git a/javascript-engine/Cargo.toml b/javascript-engine/Cargo.toml index 498eeda..6006ec1 100644 --- a/javascript-engine/Cargo.toml +++ b/javascript-engine/Cargo.toml @@ -19,3 +19,8 @@ serde_json = "1.0" iana-time-zone = { path = "external/iana-time-zone" } getrandom = { path = "external/getrandom" } chrono = { path = "external/chrono" } + +[profile.release] +lto = true +opt-level = 'z' +