|
|
|
//! Benchmarks of the whole execution engine in Boa.
|
|
|
|
|
|
|
|
use boa_engine::{context::DefaultHooks, realm::Realm, Context, Source};
|
|
|
|
use criterion::{criterion_group, criterion_main, Criterion};
|
|
|
|
use std::hint::black_box;
|
|
|
|
|
|
|
|
#[cfg(all(target_arch = "x86_64", target_os = "linux", target_env = "gnu"))]
|
|
|
|
#[cfg_attr(
|
|
|
|
all(target_arch = "x86_64", target_os = "linux", target_env = "gnu"),
|
|
|
|
global_allocator
|
|
|
|
)]
|
|
|
|
static ALLOC: jemallocator::Jemalloc = jemallocator::Jemalloc;
|
|
|
|
|
|
|
|
fn create_realm(c: &mut Criterion) {
|
|
|
|
c.bench_function("Create Realm", move |b| {
|
|
|
|
b.iter(|| Realm::create(&DefaultHooks))
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
macro_rules! full_benchmarks {
|
|
|
|
($({$id:literal, $name:ident}),*) => {
|
|
|
|
fn bench_parser(c: &mut Criterion) {
|
|
|
|
$(
|
|
|
|
{
|
|
|
|
static CODE: &str = include_str!(concat!("bench_scripts/", stringify!($name), ".js"));
|
|
|
|
let mut context = Context::default();
|
|
|
|
c.bench_function(concat!($id, " (Parser)"), move |b| {
|
Module parsing (#2411)
I'm creating this draft PR, since I wanted to have some early feedback, and because I though I would have time to finish it last week, but I got caught up with other stuff. Feel free to contribute :)
The main thing here is that I have divided `eval()`, `parse()` and similar functions so that they can decide if they are parsing scripts or modules. Let me know your thoughts.
Then, I was checking the import & export parsing, and I noticed we are using `TokenKind::Identifier` for `IdentifierName`, so I changed that name. An `Identifier` is an `IdentifierName` that isn't a `ReservedWord`. This means we should probably also adapt all `IdentifierReference`, `BindingIdentifier` and so on parsing. I already created an `Identifier` parser.
Something interesting there is that `await` is not a valid `Identifier` if the goal symbol is `Module`, as you can see in the [spec](https://tc39.es/ecma262/#prod-LabelIdentifier), but currently we don't have that information in the `InputElement` enumeration, we only have `Div`, `RegExp` and `TemplateTail`. How could we approach this?
Co-authored-by: jedel1043 <jedel0124@gmail.com>
2 years ago
|
|
|
b.iter(|| context.parse_script(black_box(Source::from_bytes(CODE))))
|
|
|
|
});
|
|
|
|
}
|
|
|
|
)*
|
|
|
|
}
|
|
|
|
fn bench_compile(c: &mut Criterion) {
|
|
|
|
$(
|
|
|
|
{
|
|
|
|
static CODE: &str = include_str!(concat!("bench_scripts/", stringify!($name), ".js"));
|
|
|
|
let mut context = Context::default();
|
Module parsing (#2411)
I'm creating this draft PR, since I wanted to have some early feedback, and because I though I would have time to finish it last week, but I got caught up with other stuff. Feel free to contribute :)
The main thing here is that I have divided `eval()`, `parse()` and similar functions so that they can decide if they are parsing scripts or modules. Let me know your thoughts.
Then, I was checking the import & export parsing, and I noticed we are using `TokenKind::Identifier` for `IdentifierName`, so I changed that name. An `Identifier` is an `IdentifierName` that isn't a `ReservedWord`. This means we should probably also adapt all `IdentifierReference`, `BindingIdentifier` and so on parsing. I already created an `Identifier` parser.
Something interesting there is that `await` is not a valid `Identifier` if the goal symbol is `Module`, as you can see in the [spec](https://tc39.es/ecma262/#prod-LabelIdentifier), but currently we don't have that information in the `InputElement` enumeration, we only have `Div`, `RegExp` and `TemplateTail`. How could we approach this?
Co-authored-by: jedel1043 <jedel0124@gmail.com>
2 years ago
|
|
|
let statement_list = context.parse_script(Source::from_bytes(CODE)).expect("parsing failed");
|
|
|
|
c.bench_function(concat!($id, " (Compiler)"), move |b| {
|
|
|
|
b.iter(|| {
|
Module parsing (#2411)
I'm creating this draft PR, since I wanted to have some early feedback, and because I though I would have time to finish it last week, but I got caught up with other stuff. Feel free to contribute :)
The main thing here is that I have divided `eval()`, `parse()` and similar functions so that they can decide if they are parsing scripts or modules. Let me know your thoughts.
Then, I was checking the import & export parsing, and I noticed we are using `TokenKind::Identifier` for `IdentifierName`, so I changed that name. An `Identifier` is an `IdentifierName` that isn't a `ReservedWord`. This means we should probably also adapt all `IdentifierReference`, `BindingIdentifier` and so on parsing. I already created an `Identifier` parser.
Something interesting there is that `await` is not a valid `Identifier` if the goal symbol is `Module`, as you can see in the [spec](https://tc39.es/ecma262/#prod-LabelIdentifier), but currently we don't have that information in the `InputElement` enumeration, we only have `Div`, `RegExp` and `TemplateTail`. How could we approach this?
Co-authored-by: jedel1043 <jedel0124@gmail.com>
2 years ago
|
|
|
context.compile_script(black_box(&statement_list))
|
|
|
|
})
|
|
|
|
});
|
|
|
|
}
|
|
|
|
)*
|
|
|
|
}
|
|
|
|
fn bench_execution(c: &mut Criterion) {
|
|
|
|
$(
|
|
|
|
{
|
|
|
|
static CODE: &str = include_str!(concat!("bench_scripts/", stringify!($name), ".js"));
|
|
|
|
let mut context = Context::default();
|
Module parsing (#2411)
I'm creating this draft PR, since I wanted to have some early feedback, and because I though I would have time to finish it last week, but I got caught up with other stuff. Feel free to contribute :)
The main thing here is that I have divided `eval()`, `parse()` and similar functions so that they can decide if they are parsing scripts or modules. Let me know your thoughts.
Then, I was checking the import & export parsing, and I noticed we are using `TokenKind::Identifier` for `IdentifierName`, so I changed that name. An `Identifier` is an `IdentifierName` that isn't a `ReservedWord`. This means we should probably also adapt all `IdentifierReference`, `BindingIdentifier` and so on parsing. I already created an `Identifier` parser.
Something interesting there is that `await` is not a valid `Identifier` if the goal symbol is `Module`, as you can see in the [spec](https://tc39.es/ecma262/#prod-LabelIdentifier), but currently we don't have that information in the `InputElement` enumeration, we only have `Div`, `RegExp` and `TemplateTail`. How could we approach this?
Co-authored-by: jedel1043 <jedel0124@gmail.com>
2 years ago
|
|
|
let statement_list = context.parse_script(Source::from_bytes(CODE)).expect("parsing failed");
|
|
|
|
let code_block = context.compile_script(&statement_list).unwrap();
|
|
|
|
c.bench_function(concat!($id, " (Execution)"), move |b| {
|
|
|
|
b.iter(|| {
|
|
|
|
context.execute(black_box(code_block.clone())).unwrap()
|
|
|
|
})
|
|
|
|
});
|
|
|
|
}
|
|
|
|
)*
|
|
|
|
}
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
full_benchmarks!(
|
|
|
|
{"Symbols", symbol_creation},
|
|
|
|
{"For loop", for_loop},
|
|
|
|
{"Fibonacci", fibonacci},
|
|
|
|
{"Object Creation", object_creation},
|
|
|
|
{"Static Object Property Access", object_prop_access_const},
|
|
|
|
{"Dynamic Object Property Access", object_prop_access_dyn},
|
|
|
|
{"RegExp Literal Creation", regexp_literal_creation},
|
|
|
|
{"RegExp Creation", regexp_creation},
|
|
|
|
{"RegExp Literal", regexp_literal},
|
|
|
|
{"RegExp", regexp},
|
|
|
|
{"Array access", array_access},
|
|
|
|
{"Array creation", array_create},
|
|
|
|
{"Array pop", array_pop},
|
|
|
|
{"String concatenation", string_concat},
|
|
|
|
{"String comparison", string_compare},
|
|
|
|
{"String copy", string_copy},
|
|
|
|
{"Number Object Access", number_object_access},
|
|
|
|
{"Boolean Object Access", boolean_object_access},
|
|
|
|
{"String Object Access", string_object_access},
|
|
|
|
{"Arithmetic operations", arithmetic_operations},
|
|
|
|
{"Clean js", clean_js},
|
|
|
|
{"Mini js", mini_js}
|
|
|
|
);
|
|
|
|
|
|
|
|
criterion_group!(
|
|
|
|
benches,
|
|
|
|
create_realm,
|
|
|
|
bench_parser,
|
|
|
|
bench_compile,
|
|
|
|
bench_execution,
|
|
|
|
);
|
|
|
|
criterion_main!(benches);
|