1
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2024-11-28 16:20:57 -05:00

perf: use fast api for core.isProxy (#15682)

This commit is contained in:
Divy Srivastava 2022-08-30 14:31:36 +05:30 committed by GitHub
parent 448654764f
commit a7558196a7
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 62 additions and 26 deletions

View file

@ -41,16 +41,6 @@ fn bench_op_async(b: &mut Bencher) {
bench_js_async(b, r#"Deno.core.opAsync("op_pi_async");"#, setup); bench_js_async(b, r#"Deno.core.opAsync("op_pi_async");"#, setup);
} }
fn bench_is_proxy(b: &mut Bencher) { benchmark_group!(benches, bench_op_pi_json, bench_op_nop, bench_op_async,);
bench_js_sync(b, r#"Deno.core.isProxy(42);"#, setup);
}
benchmark_group!(
benches,
bench_op_pi_json,
bench_op_nop,
bench_op_async,
bench_is_proxy
);
bench_or_profile!(benches); bench_or_profile!(benches);

View file

@ -306,7 +306,7 @@
deserialize: (buffer, options) => ops.op_deserialize(buffer, options), deserialize: (buffer, options) => ops.op_deserialize(buffer, options),
getPromiseDetails: (promise) => ops.op_get_promise_details(promise), getPromiseDetails: (promise) => ops.op_get_promise_details(promise),
getProxyDetails: (proxy) => ops.op_get_proxy_details(proxy), getProxyDetails: (proxy) => ops.op_get_proxy_details(proxy),
isProxy: (value) => ops.op_is_proxy(value), isProxy: (value) => ops.op_is_proxy.fast(value),
memoryUsage: () => ops.op_memory_usage(), memoryUsage: () => ops.op_memory_usage(),
setWasmStreamingCallback: (fn) => ops.op_set_wasm_streaming_callback(fn), setWasmStreamingCallback: (fn) => ops.op_set_wasm_streaming_callback(fn),
abortWasmStreaming: ( abortWasmStreaming: (

View file

@ -191,7 +191,7 @@ fn op_format_file_name(file_name: String) -> String {
format_file_name(&file_name) format_file_name(&file_name)
} }
#[op] #[op(fast)]
fn op_is_proxy(value: serde_v8::Value) -> bool { fn op_is_proxy(value: serde_v8::Value) -> bool {
value.v8_value.is_proxy() value.v8_value.is_proxy()
} }

View file

@ -3121,6 +3121,7 @@ assertEquals(1, notify_return_value);
runtime.execute_script("<none>", "").unwrap(); runtime.execute_script("<none>", "").unwrap();
} }
#[ignore] // TODO(@littledivy): Fast API ops when snapshot is not loaded.
#[test] #[test]
fn test_is_proxy() { fn test_is_proxy() {
let mut runtime = JsRuntime::new(RuntimeOptions::default()); let mut runtime = JsRuntime::new(RuntimeOptions::default());

View file

@ -304,6 +304,7 @@ fn codegen_fast_impl(
args, args,
ret, ret,
use_recv, use_recv,
v8_values,
}) = fast_info }) = fast_info
{ {
let inputs = &f let inputs = &f
@ -311,17 +312,42 @@ fn codegen_fast_impl(
.inputs .inputs
.iter() .iter()
.skip(if use_recv { 1 } else { 0 }) .skip(if use_recv { 1 } else { 0 })
.collect::<Vec<_>>(); .enumerate()
let input_idents = f .map(|(idx, arg)| {
.sig if v8_values.contains(&idx) {
.inputs let ident = match arg {
.iter()
.map(|a| match a {
FnArg::Receiver(_) => unreachable!(), FnArg::Receiver(_) => unreachable!(),
FnArg::Typed(t) => match &*t.pat { FnArg::Typed(t) => match &*t.pat {
syn::Pat::Ident(i) => format_ident!("{}", i.ident), syn::Pat::Ident(i) => format_ident!("{}", i.ident),
_ => unreachable!(), _ => unreachable!(),
}, },
};
return quote! { #ident: #core::v8::Local < #core::v8::Value > };
}
quote!(#arg)
})
.collect::<Vec<_>>();
let input_idents = f
.sig
.inputs
.iter()
.enumerate()
.map(|(idx, a)| {
let ident = match a {
FnArg::Receiver(_) => unreachable!(),
FnArg::Typed(t) => match &*t.pat {
syn::Pat::Ident(i) => format_ident!("{}", i.ident),
_ => unreachable!(),
},
};
if v8_values.contains(&idx) {
return quote! {
#core::serde_v8::Value {
v8_value: #ident,
}
};
}
quote! { #ident }
}) })
.collect::<Vec<_>>(); .collect::<Vec<_>>();
let generics = &f.sig.generics; let generics = &f.sig.generics;
@ -453,6 +479,7 @@ struct FastApiSyn {
args: TokenStream2, args: TokenStream2,
ret: TokenStream2, ret: TokenStream2,
use_recv: bool, use_recv: bool,
v8_values: Vec<usize>,
} }
fn can_be_fast_api(core: &TokenStream2, f: &syn::ItemFn) -> Option<FastApiSyn> { fn can_be_fast_api(core: &TokenStream2, f: &syn::ItemFn) -> Option<FastApiSyn> {
@ -466,6 +493,7 @@ fn can_be_fast_api(core: &TokenStream2, f: &syn::ItemFn) -> Option<FastApiSyn> {
}; };
let mut use_recv = false; let mut use_recv = false;
let mut v8_values = Vec::new();
let mut args = vec![quote! { #core::v8::fast_api::Type::V8Value }]; let mut args = vec![quote! { #core::v8::fast_api::Type::V8Value }];
for (pos, input) in inputs.iter().enumerate() { for (pos, input) in inputs.iter().enumerate() {
if pos == 0 && is_mut_ref_opstate(input) { if pos == 0 && is_mut_ref_opstate(input) {
@ -478,6 +506,10 @@ fn can_be_fast_api(core: &TokenStream2, f: &syn::ItemFn) -> Option<FastApiSyn> {
_ => unreachable!(), _ => unreachable!(),
}; };
if let Some(arg) = is_fast_v8_value(core, ty) {
args.push(arg);
v8_values.push(pos);
} else {
match is_fast_scalar(core, ty, false) { match is_fast_scalar(core, ty, false) {
None => match is_fast_arg_sequence(core, ty) { None => match is_fast_arg_sequence(core, ty) {
Some(arg) => { Some(arg) => {
@ -491,6 +523,7 @@ fn can_be_fast_api(core: &TokenStream2, f: &syn::ItemFn) -> Option<FastApiSyn> {
} }
} }
} }
}
let args = args let args = args
.iter() .iter()
@ -501,6 +534,7 @@ fn can_be_fast_api(core: &TokenStream2, f: &syn::ItemFn) -> Option<FastApiSyn> {
args: args.parse().unwrap(), args: args.parse().unwrap(),
ret, ret,
use_recv, use_recv,
v8_values,
}) })
} }
@ -523,6 +557,16 @@ fn is_fast_arg_sequence(
None None
} }
fn is_fast_v8_value(
core: &TokenStream2,
arg: impl ToTokens,
) -> Option<TokenStream2> {
if tokens(&arg).contains("serde_v8 :: Value") {
return Some(quote! { #core::v8::fast_api::Type::V8Value });
}
None
}
fn is_local_array(arg: impl ToTokens) -> bool { fn is_local_array(arg: impl ToTokens) -> bool {
static RE: Lazy<Regex> = static RE: Lazy<Regex> =
Lazy::new(|| Regex::new(r"^v8::Local<v8::Array>$").unwrap()); Lazy::new(|| Regex::new(r"^v8::Local<v8::Array>$").unwrap());
@ -558,6 +602,7 @@ fn is_fast_scalar(
"i32" => Some(quote! { #core::v8::fast_api::#cty::Int32 }), "i32" => Some(quote! { #core::v8::fast_api::#cty::Int32 }),
"f32" => Some(quote! { #core::v8::fast_api::#cty::Float32 }), "f32" => Some(quote! { #core::v8::fast_api::#cty::Float32 }),
"f64" => Some(quote! { #core::v8::fast_api::#cty::Float64 }), "f64" => Some(quote! { #core::v8::fast_api::#cty::Float64 }),
"bool" => Some(quote! { #core::v8::fast_api::#cty::Bool }),
_ => None, _ => None,
} }
} }