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:
Matt Mastracci 2023-04-30 10:50:24 +02:00 committed by GitHub
parent 9c8ebce3dc
commit bb1f5e4262
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
45 changed files with 737 additions and 237 deletions

View file

@ -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)

View file

@ -41,6 +41,7 @@ impl op_void_async {
is_unstable: false,
is_v8: false,
force_registration: false,
arg_count: 1usize as u8,
}
}
#[inline]

View file

@ -41,6 +41,7 @@ impl op_async_result {
is_unstable: false,
is_v8: false,
force_registration: false,
arg_count: 2usize as u8,
}
}
#[inline]

View file

@ -41,6 +41,7 @@ impl op_fallback {
is_unstable: false,
is_v8: false,
force_registration: false,
arg_count: 1usize as u8,
}
}
#[inline]

View file

@ -41,6 +41,7 @@ impl op_cow_str {
is_unstable: false,
is_v8: false,
force_registration: false,
arg_count: 1usize as u8,
}
}
#[inline]

View file

@ -41,6 +41,7 @@ impl op_f64_buf {
is_unstable: false,
is_v8: false,
force_registration: false,
arg_count: 1usize as u8,
}
}
#[inline]

View file

@ -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]

View file

@ -31,6 +31,7 @@ impl send_stdin {
is_unstable: false,
is_v8: false,
force_registration: false,
arg_count: 2usize as u8,
}
}
#[inline]

View file

@ -31,6 +31,7 @@ impl send_stdin {
is_unstable: false,
is_v8: false,
force_registration: false,
arg_count: 2usize as u8,
}
}
#[inline]

View file

@ -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]

View file

@ -41,6 +41,7 @@ impl op_ffi_ptr_value {
is_unstable: false,
is_v8: false,
force_registration: false,
arg_count: 2usize as u8,
}
}
#[inline]

View file

@ -31,6 +31,7 @@ impl op_print {
is_unstable: false,
is_v8: false,
force_registration: false,
arg_count: 2usize as u8,
}
}
#[inline]

View file

@ -41,6 +41,7 @@ impl op_set_exit_code {
is_unstable: false,
is_v8: false,
force_registration: false,
arg_count: 1usize as u8,
}
}
#[inline]

View file

@ -41,6 +41,7 @@ impl foo {
is_unstable: false,
is_v8: false,
force_registration: false,
arg_count: 2usize as u8,
}
}
#[inline]

View file

@ -47,6 +47,7 @@ impl op_foo {
is_unstable: false,
is_v8: false,
force_registration: false,
arg_count: 0usize as u8,
}
}
#[inline]

View file

@ -41,6 +41,7 @@ impl foo {
is_unstable: false,
is_v8: false,
force_registration: false,
arg_count: 2usize as u8,
}
}
#[inline]

View file

@ -41,6 +41,7 @@ impl op_listen {
is_unstable: false,
is_v8: false,
force_registration: false,
arg_count: 0usize as u8,
}
}
#[inline]

View file

@ -47,6 +47,7 @@ impl op_now {
is_unstable: false,
is_v8: false,
force_registration: false,
arg_count: 1usize as u8,
}
}
#[inline]

View file

@ -41,6 +41,7 @@ impl op_add_4 {
is_unstable: false,
is_v8: false,
force_registration: false,
arg_count: 4usize as u8,
}
}
#[inline]

View file

@ -31,6 +31,7 @@ impl op_try_close {
is_unstable: false,
is_v8: false,
force_registration: false,
arg_count: 1usize as u8,
}
}
#[inline]

View file

@ -41,6 +41,7 @@ impl op_string_length {
is_unstable: false,
is_v8: false,
force_registration: false,
arg_count: 1usize as u8,
}
}
#[inline]

View file

@ -31,6 +31,7 @@ impl op_read_sync {
is_unstable: false,
is_v8: false,
force_registration: false,
arg_count: 2usize as u8,
}
}
#[inline]

View file

@ -52,6 +52,7 @@ impl op_ffi_ptr_of {
is_unstable: false,
is_v8: false,
force_registration: false,
arg_count: 2usize as u8,
}
}
#[inline]

View file

@ -41,6 +41,7 @@ impl op_is_proxy {
is_unstable: false,
is_v8: false,
force_registration: false,
arg_count: 1usize as u8,
}
}
#[inline]

View file

@ -41,6 +41,7 @@ impl op_string_length {
is_unstable: false,
is_v8: false,
force_registration: false,
arg_count: 1usize as u8,
}
}
#[inline]

View file

@ -31,6 +31,7 @@ impl op_string_length {
is_unstable: false,
is_v8: false,
force_registration: false,
arg_count: 1usize as u8,
}
}
#[inline]

View file

@ -31,6 +31,7 @@ impl op_bench_now {
is_unstable: false,
is_v8: false,
force_registration: false,
arg_count: 0usize as u8,
}
}
#[inline]

View file

@ -41,6 +41,7 @@ impl op_import_spki_x25519 {
is_unstable: false,
is_v8: false,
force_registration: false,
arg_count: 2usize as u8,
}
}
#[inline]

View file

@ -41,6 +41,7 @@ impl op_unit_result {
is_unstable: false,
is_v8: false,
force_registration: false,
arg_count: 0usize as u8,
}
}
#[inline]

View file

@ -41,6 +41,7 @@ impl op_set_nodelay {
is_unstable: false,
is_v8: false,
force_registration: false,
arg_count: 2usize as u8,
}
}
#[inline]

View file

@ -41,6 +41,7 @@ impl op_unit {
is_unstable: false,
is_v8: false,
force_registration: false,
arg_count: 0usize as u8,
}
}
#[inline]

View file

@ -41,6 +41,7 @@ impl op_wasm {
is_unstable: false,
is_v8: false,
force_registration: false,
arg_count: 1usize as u8,
}
}
#[inline]