mirror of
https://github.com/denoland/deno.git
synced 2025-08-04 19:08:15 +00:00
perf(core): async op pseudo-codegen and performance work (#18887)
Performance: ``` async_ops.js: 760k -> 1030k (!) async_ops_deferred.js: 730k -> 770k Deno.serve bench: 118k -> 124k WS test w/ third_party/prebuilt/mac/load_test 100 localhost 8000 0 0: unchanged Startup time: approx 0.5ms slower (13.7 -> 14.2ms) ```
This commit is contained in:
parent
9c8ebce3dc
commit
bb1f5e4262
45 changed files with 737 additions and 237 deletions
24
ops/lib.rs
24
ops/lib.rs
|
@ -144,6 +144,8 @@ impl Op {
|
|||
is_unstable: #is_unstable,
|
||||
is_v8: #is_v8,
|
||||
force_registration: false,
|
||||
// TODO(mmastrac)
|
||||
arg_count: 0,
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -158,8 +160,8 @@ impl Op {
|
|||
|
||||
let has_fallible_fast_call = active && optimizer.returns_result;
|
||||
|
||||
let v8_body = if is_async {
|
||||
let deferred = attrs.deferred;
|
||||
let (v8_body, arg_count) = if is_async {
|
||||
let deferred: bool = attrs.deferred;
|
||||
codegen_v8_async(
|
||||
&core,
|
||||
&item,
|
||||
|
@ -205,6 +207,7 @@ impl Op {
|
|||
is_unstable: #is_unstable,
|
||||
is_v8: #is_v8,
|
||||
force_registration: false,
|
||||
arg_count: #arg_count as u8,
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -241,7 +244,7 @@ fn codegen_v8_async(
|
|||
margs: Attributes,
|
||||
asyncness: bool,
|
||||
deferred: bool,
|
||||
) -> TokenStream2 {
|
||||
) -> (TokenStream2, usize) {
|
||||
let Attributes { is_v8, .. } = margs;
|
||||
let special_args = f
|
||||
.sig
|
||||
|
@ -309,7 +312,7 @@ fn codegen_v8_async(
|
|||
}
|
||||
};
|
||||
|
||||
quote! {
|
||||
let token_stream = quote! {
|
||||
use #core::futures::FutureExt;
|
||||
// SAFETY: #core guarantees args.data() is a v8 External pointing to an OpCtx for the isolates lifetime
|
||||
let ctx = unsafe {
|
||||
|
@ -336,7 +339,10 @@ fn codegen_v8_async(
|
|||
if let Some(response) = maybe_response {
|
||||
rv.set(response);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// +1 arg for the promise ID
|
||||
(token_stream, 1 + f.sig.inputs.len() - rust_i0)
|
||||
}
|
||||
|
||||
fn scope_arg(arg: &FnArg) -> Option<TokenStream2> {
|
||||
|
@ -373,7 +379,7 @@ fn codegen_v8_sync(
|
|||
f: &syn::ItemFn,
|
||||
margs: Attributes,
|
||||
has_fallible_fast_call: bool,
|
||||
) -> TokenStream2 {
|
||||
) -> (TokenStream2, usize) {
|
||||
let Attributes { is_v8, .. } = margs;
|
||||
let special_args = f
|
||||
.sig
|
||||
|
@ -404,7 +410,7 @@ fn codegen_v8_sync(
|
|||
quote! {}
|
||||
};
|
||||
|
||||
quote! {
|
||||
let token_stream = quote! {
|
||||
// SAFETY: #core guarantees args.data() is a v8 External pointing to an OpCtx for the isolates lifetime
|
||||
let ctx = unsafe {
|
||||
&*(#core::v8::Local::<#core::v8::External>::cast(args.data()).value()
|
||||
|
@ -421,7 +427,9 @@ fn codegen_v8_sync(
|
|||
op_state.tracker.track_sync(ctx.id);
|
||||
|
||||
#ret
|
||||
}
|
||||
};
|
||||
|
||||
(token_stream, f.sig.inputs.len() - rust_i0)
|
||||
}
|
||||
|
||||
/// (full declarations, idents, v8 argument count)
|
||||
|
|
|
@ -41,6 +41,7 @@ impl op_void_async {
|
|||
is_unstable: false,
|
||||
is_v8: false,
|
||||
force_registration: false,
|
||||
arg_count: 1usize as u8,
|
||||
}
|
||||
}
|
||||
#[inline]
|
||||
|
|
|
@ -41,6 +41,7 @@ impl op_async_result {
|
|||
is_unstable: false,
|
||||
is_v8: false,
|
||||
force_registration: false,
|
||||
arg_count: 2usize as u8,
|
||||
}
|
||||
}
|
||||
#[inline]
|
||||
|
|
|
@ -41,6 +41,7 @@ impl op_fallback {
|
|||
is_unstable: false,
|
||||
is_v8: false,
|
||||
force_registration: false,
|
||||
arg_count: 1usize as u8,
|
||||
}
|
||||
}
|
||||
#[inline]
|
||||
|
|
|
@ -41,6 +41,7 @@ impl op_cow_str {
|
|||
is_unstable: false,
|
||||
is_v8: false,
|
||||
force_registration: false,
|
||||
arg_count: 1usize as u8,
|
||||
}
|
||||
}
|
||||
#[inline]
|
||||
|
|
|
@ -41,6 +41,7 @@ impl op_f64_buf {
|
|||
is_unstable: false,
|
||||
is_v8: false,
|
||||
force_registration: false,
|
||||
arg_count: 1usize as u8,
|
||||
}
|
||||
}
|
||||
#[inline]
|
||||
|
|
|
@ -31,6 +31,7 @@ impl op_sync_serialize_object_with_numbers_as_keys {
|
|||
is_unstable: false,
|
||||
is_v8: false,
|
||||
force_registration: false,
|
||||
arg_count: 1usize as u8,
|
||||
}
|
||||
}
|
||||
#[inline]
|
||||
|
|
|
@ -31,6 +31,7 @@ impl send_stdin {
|
|||
is_unstable: false,
|
||||
is_v8: false,
|
||||
force_registration: false,
|
||||
arg_count: 2usize as u8,
|
||||
}
|
||||
}
|
||||
#[inline]
|
||||
|
|
|
@ -31,6 +31,7 @@ impl send_stdin {
|
|||
is_unstable: false,
|
||||
is_v8: false,
|
||||
force_registration: false,
|
||||
arg_count: 2usize as u8,
|
||||
}
|
||||
}
|
||||
#[inline]
|
||||
|
|
|
@ -31,6 +31,7 @@ impl op_blob_revoke_object_url {
|
|||
is_unstable: false,
|
||||
is_v8: false,
|
||||
force_registration: false,
|
||||
arg_count: 1usize as u8,
|
||||
}
|
||||
}
|
||||
#[inline]
|
||||
|
|
|
@ -41,6 +41,7 @@ impl op_ffi_ptr_value {
|
|||
is_unstable: false,
|
||||
is_v8: false,
|
||||
force_registration: false,
|
||||
arg_count: 2usize as u8,
|
||||
}
|
||||
}
|
||||
#[inline]
|
||||
|
|
|
@ -31,6 +31,7 @@ impl op_print {
|
|||
is_unstable: false,
|
||||
is_v8: false,
|
||||
force_registration: false,
|
||||
arg_count: 2usize as u8,
|
||||
}
|
||||
}
|
||||
#[inline]
|
||||
|
|
|
@ -41,6 +41,7 @@ impl op_set_exit_code {
|
|||
is_unstable: false,
|
||||
is_v8: false,
|
||||
force_registration: false,
|
||||
arg_count: 1usize as u8,
|
||||
}
|
||||
}
|
||||
#[inline]
|
||||
|
|
|
@ -41,6 +41,7 @@ impl foo {
|
|||
is_unstable: false,
|
||||
is_v8: false,
|
||||
force_registration: false,
|
||||
arg_count: 2usize as u8,
|
||||
}
|
||||
}
|
||||
#[inline]
|
||||
|
|
|
@ -47,6 +47,7 @@ impl op_foo {
|
|||
is_unstable: false,
|
||||
is_v8: false,
|
||||
force_registration: false,
|
||||
arg_count: 0usize as u8,
|
||||
}
|
||||
}
|
||||
#[inline]
|
||||
|
|
|
@ -41,6 +41,7 @@ impl foo {
|
|||
is_unstable: false,
|
||||
is_v8: false,
|
||||
force_registration: false,
|
||||
arg_count: 2usize as u8,
|
||||
}
|
||||
}
|
||||
#[inline]
|
||||
|
|
|
@ -41,6 +41,7 @@ impl op_listen {
|
|||
is_unstable: false,
|
||||
is_v8: false,
|
||||
force_registration: false,
|
||||
arg_count: 0usize as u8,
|
||||
}
|
||||
}
|
||||
#[inline]
|
||||
|
|
|
@ -47,6 +47,7 @@ impl op_now {
|
|||
is_unstable: false,
|
||||
is_v8: false,
|
||||
force_registration: false,
|
||||
arg_count: 1usize as u8,
|
||||
}
|
||||
}
|
||||
#[inline]
|
||||
|
|
|
@ -41,6 +41,7 @@ impl op_add_4 {
|
|||
is_unstable: false,
|
||||
is_v8: false,
|
||||
force_registration: false,
|
||||
arg_count: 4usize as u8,
|
||||
}
|
||||
}
|
||||
#[inline]
|
||||
|
|
|
@ -31,6 +31,7 @@ impl op_try_close {
|
|||
is_unstable: false,
|
||||
is_v8: false,
|
||||
force_registration: false,
|
||||
arg_count: 1usize as u8,
|
||||
}
|
||||
}
|
||||
#[inline]
|
||||
|
|
|
@ -41,6 +41,7 @@ impl op_string_length {
|
|||
is_unstable: false,
|
||||
is_v8: false,
|
||||
force_registration: false,
|
||||
arg_count: 1usize as u8,
|
||||
}
|
||||
}
|
||||
#[inline]
|
||||
|
|
|
@ -31,6 +31,7 @@ impl op_read_sync {
|
|||
is_unstable: false,
|
||||
is_v8: false,
|
||||
force_registration: false,
|
||||
arg_count: 2usize as u8,
|
||||
}
|
||||
}
|
||||
#[inline]
|
||||
|
|
|
@ -52,6 +52,7 @@ impl op_ffi_ptr_of {
|
|||
is_unstable: false,
|
||||
is_v8: false,
|
||||
force_registration: false,
|
||||
arg_count: 2usize as u8,
|
||||
}
|
||||
}
|
||||
#[inline]
|
||||
|
|
|
@ -41,6 +41,7 @@ impl op_is_proxy {
|
|||
is_unstable: false,
|
||||
is_v8: false,
|
||||
force_registration: false,
|
||||
arg_count: 1usize as u8,
|
||||
}
|
||||
}
|
||||
#[inline]
|
||||
|
|
|
@ -41,6 +41,7 @@ impl op_string_length {
|
|||
is_unstable: false,
|
||||
is_v8: false,
|
||||
force_registration: false,
|
||||
arg_count: 1usize as u8,
|
||||
}
|
||||
}
|
||||
#[inline]
|
||||
|
|
|
@ -31,6 +31,7 @@ impl op_string_length {
|
|||
is_unstable: false,
|
||||
is_v8: false,
|
||||
force_registration: false,
|
||||
arg_count: 1usize as u8,
|
||||
}
|
||||
}
|
||||
#[inline]
|
||||
|
|
|
@ -31,6 +31,7 @@ impl op_bench_now {
|
|||
is_unstable: false,
|
||||
is_v8: false,
|
||||
force_registration: false,
|
||||
arg_count: 0usize as u8,
|
||||
}
|
||||
}
|
||||
#[inline]
|
||||
|
|
|
@ -41,6 +41,7 @@ impl op_import_spki_x25519 {
|
|||
is_unstable: false,
|
||||
is_v8: false,
|
||||
force_registration: false,
|
||||
arg_count: 2usize as u8,
|
||||
}
|
||||
}
|
||||
#[inline]
|
||||
|
|
|
@ -41,6 +41,7 @@ impl op_unit_result {
|
|||
is_unstable: false,
|
||||
is_v8: false,
|
||||
force_registration: false,
|
||||
arg_count: 0usize as u8,
|
||||
}
|
||||
}
|
||||
#[inline]
|
||||
|
|
|
@ -41,6 +41,7 @@ impl op_set_nodelay {
|
|||
is_unstable: false,
|
||||
is_v8: false,
|
||||
force_registration: false,
|
||||
arg_count: 2usize as u8,
|
||||
}
|
||||
}
|
||||
#[inline]
|
||||
|
|
|
@ -41,6 +41,7 @@ impl op_unit {
|
|||
is_unstable: false,
|
||||
is_v8: false,
|
||||
force_registration: false,
|
||||
arg_count: 0usize as u8,
|
||||
}
|
||||
}
|
||||
#[inline]
|
||||
|
|
|
@ -41,6 +41,7 @@ impl op_wasm {
|
|||
is_unstable: false,
|
||||
is_v8: false,
|
||||
force_registration: false,
|
||||
arg_count: 1usize as u8,
|
||||
}
|
||||
}
|
||||
#[inline]
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue