mirror of
https://github.com/nushell/nushell
synced 2024-12-27 05:23:11 +00:00
Divan extra benchmarks (#12025)
This PR builds on #12000 and adds a few more benchmarks. one to benchmark how long it takes to eval std, and a few different pipeline commands.
This commit is contained in:
parent
5e937ca1af
commit
d05f94e5fc
1 changed files with 142 additions and 6 deletions
|
@ -1,9 +1,11 @@
|
||||||
use nu_cli::eval_source;
|
use nu_cli::{eval_source, evaluate_commands};
|
||||||
use nu_parser::parse;
|
use nu_parser::parse;
|
||||||
use nu_plugin::{Encoder, EncodingType, PluginCallResponse, PluginOutput};
|
use nu_plugin::{Encoder, EncodingType, PluginCallResponse, PluginOutput};
|
||||||
use nu_protocol::{
|
use nu_protocol::{
|
||||||
engine::EngineState, eval_const::create_nu_constant, PipelineData, Span, Value, NU_VARIABLE_ID,
|
engine::EngineState, eval_const::create_nu_constant, PipelineData, Span, Spanned, Value,
|
||||||
|
NU_VARIABLE_ID,
|
||||||
};
|
};
|
||||||
|
use nu_std::load_standard_library;
|
||||||
use nu_utils::{get_default_config, get_default_env};
|
use nu_utils::{get_default_config, get_default_env};
|
||||||
use std::path::{Path, PathBuf};
|
use std::path::{Path, PathBuf};
|
||||||
|
|
||||||
|
@ -57,6 +59,140 @@ fn setup_engine() -> EngineState {
|
||||||
// an executable for every single one - incredibly slowly. Would be nice to figure out
|
// an executable for every single one - incredibly slowly. Would be nice to figure out
|
||||||
// a way to split things up again.
|
// a way to split things up again.
|
||||||
|
|
||||||
|
#[divan::bench]
|
||||||
|
fn load_standard_lib(bencher: divan::Bencher) {
|
||||||
|
let engine = setup_engine();
|
||||||
|
bencher
|
||||||
|
.with_inputs(|| engine.clone())
|
||||||
|
.bench_values(|mut engine| {
|
||||||
|
load_standard_library(&mut engine).unwrap();
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
#[divan::bench_group]
|
||||||
|
mod eval_commands {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[divan::bench(args = [100, 1_000, 10_000])]
|
||||||
|
fn interleave(bencher: divan::Bencher, n: i32) {
|
||||||
|
let mut engine = setup_engine();
|
||||||
|
load_standard_library(&mut engine).unwrap();
|
||||||
|
let commands = Spanned {
|
||||||
|
span: Span::unknown(),
|
||||||
|
item: format!("seq 1 {n} | wrap a | interleave {{ seq 1 {n} | wrap b }} | ignore")
|
||||||
|
.to_string(),
|
||||||
|
};
|
||||||
|
|
||||||
|
bencher
|
||||||
|
.with_inputs(|| engine.clone())
|
||||||
|
.bench_values(|mut engine| {
|
||||||
|
evaluate_commands(
|
||||||
|
&commands,
|
||||||
|
&mut engine,
|
||||||
|
&mut nu_protocol::engine::Stack::new(),
|
||||||
|
PipelineData::empty(),
|
||||||
|
None,
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
#[divan::bench(args = [1, 5, 10, 100, 1_000])]
|
||||||
|
fn for_range(bencher: divan::Bencher, n: i32) {
|
||||||
|
let mut engine = setup_engine();
|
||||||
|
load_standard_library(&mut engine).unwrap();
|
||||||
|
let commands = Spanned {
|
||||||
|
span: Span::unknown(),
|
||||||
|
item: format!("(for $x in (1..{}) {{ sleep 50ns }})", n).to_string(),
|
||||||
|
};
|
||||||
|
let stack = nu_protocol::engine::Stack::new();
|
||||||
|
|
||||||
|
bencher
|
||||||
|
.with_inputs(|| (engine.clone(), stack.clone()))
|
||||||
|
.bench_values(|(mut engine, mut stack)| {
|
||||||
|
evaluate_commands(
|
||||||
|
&commands,
|
||||||
|
&mut engine,
|
||||||
|
&mut stack,
|
||||||
|
PipelineData::empty(),
|
||||||
|
None,
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
#[divan::bench(args = [1, 5, 10, 100, 1_000])]
|
||||||
|
fn each(bencher: divan::Bencher, n: i32) {
|
||||||
|
let mut engine = setup_engine();
|
||||||
|
load_standard_library(&mut engine).unwrap();
|
||||||
|
let commands = Spanned {
|
||||||
|
span: Span::unknown(),
|
||||||
|
item: format!("(1..{}) | each {{|_| sleep 50ns }} | ignore", n).to_string(),
|
||||||
|
};
|
||||||
|
let stack = nu_protocol::engine::Stack::new();
|
||||||
|
|
||||||
|
bencher
|
||||||
|
.with_inputs(|| (engine.clone(), stack.clone()))
|
||||||
|
.bench_values(|(mut engine, mut stack)| {
|
||||||
|
evaluate_commands(
|
||||||
|
&commands,
|
||||||
|
&mut engine,
|
||||||
|
&mut stack,
|
||||||
|
PipelineData::empty(),
|
||||||
|
None,
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
#[divan::bench(args = [1, 5, 10, 100, 1_000])]
|
||||||
|
fn par_each_1t(bencher: divan::Bencher, n: i32) {
|
||||||
|
let mut engine = setup_engine();
|
||||||
|
load_standard_library(&mut engine).unwrap();
|
||||||
|
let commands = Spanned {
|
||||||
|
span: Span::unknown(),
|
||||||
|
item: format!("(1..{}) | par-each -t 1 {{|_| sleep 50ns }} | ignore", n).to_string(),
|
||||||
|
};
|
||||||
|
let stack = nu_protocol::engine::Stack::new();
|
||||||
|
|
||||||
|
bencher
|
||||||
|
.with_inputs(|| (engine.clone(), stack.clone()))
|
||||||
|
.bench_values(|(mut engine, mut stack)| {
|
||||||
|
evaluate_commands(
|
||||||
|
&commands,
|
||||||
|
&mut engine,
|
||||||
|
&mut stack,
|
||||||
|
PipelineData::empty(),
|
||||||
|
None,
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
|
})
|
||||||
|
}
|
||||||
|
#[divan::bench(args = [1, 5, 10, 100, 1_000])]
|
||||||
|
fn par_each_2t(bencher: divan::Bencher, n: i32) {
|
||||||
|
let mut engine = setup_engine();
|
||||||
|
load_standard_library(&mut engine).unwrap();
|
||||||
|
let commands = Spanned {
|
||||||
|
span: Span::unknown(),
|
||||||
|
item: format!("(1..{}) | par-each -t 2 {{|_| sleep 50ns }} | ignore", n).to_string(),
|
||||||
|
};
|
||||||
|
let stack = nu_protocol::engine::Stack::new();
|
||||||
|
|
||||||
|
bencher
|
||||||
|
.with_inputs(|| (engine.clone(), stack.clone()))
|
||||||
|
.bench_values(|(mut engine, mut stack)| {
|
||||||
|
evaluate_commands(
|
||||||
|
&commands,
|
||||||
|
&mut engine,
|
||||||
|
&mut stack,
|
||||||
|
PipelineData::empty(),
|
||||||
|
None,
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[divan::bench_group()]
|
#[divan::bench_group()]
|
||||||
mod parser_benchmarks {
|
mod parser_benchmarks {
|
||||||
use super::*;
|
use super::*;
|
||||||
|
@ -68,7 +204,7 @@ mod parser_benchmarks {
|
||||||
|
|
||||||
bencher
|
bencher
|
||||||
.with_inputs(|| nu_protocol::engine::StateWorkingSet::new(&engine_state))
|
.with_inputs(|| nu_protocol::engine::StateWorkingSet::new(&engine_state))
|
||||||
.bench_refs(|working_set| parse(working_set, None, default_env, false))
|
.bench_refs(|mut working_set| parse(&mut working_set, None, default_env, false))
|
||||||
}
|
}
|
||||||
|
|
||||||
#[divan::bench()]
|
#[divan::bench()]
|
||||||
|
@ -78,7 +214,7 @@ mod parser_benchmarks {
|
||||||
|
|
||||||
bencher
|
bencher
|
||||||
.with_inputs(|| nu_protocol::engine::StateWorkingSet::new(&engine_state))
|
.with_inputs(|| nu_protocol::engine::StateWorkingSet::new(&engine_state))
|
||||||
.bench_refs(|working_set| parse(working_set, None, default_env, false))
|
.bench_refs(|mut working_set| parse(&mut working_set, None, default_env, false))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -146,7 +282,7 @@ mod encoding_benchmarks {
|
||||||
);
|
);
|
||||||
let encoder = EncodingType::try_from_bytes(b"json").unwrap();
|
let encoder = EncodingType::try_from_bytes(b"json").unwrap();
|
||||||
bencher
|
bencher
|
||||||
.with_inputs(Vec::new)
|
.with_inputs(|| (vec![]))
|
||||||
.bench_values(|mut res| encoder.encode(&test_data, &mut res))
|
.bench_values(|mut res| encoder.encode(&test_data, &mut res))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -158,7 +294,7 @@ mod encoding_benchmarks {
|
||||||
);
|
);
|
||||||
let encoder = EncodingType::try_from_bytes(b"msgpack").unwrap();
|
let encoder = EncodingType::try_from_bytes(b"msgpack").unwrap();
|
||||||
bencher
|
bencher
|
||||||
.with_inputs(Vec::new)
|
.with_inputs(|| (vec![]))
|
||||||
.bench_values(|mut res| encoder.encode(&test_data, &mut res))
|
.bench_values(|mut res| encoder.encode(&test_data, &mut res))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue