mirror of
https://github.com/nushell/nushell.git
synced 2025-01-23 14:50:09 +01:00
Add env var during benchmark to randomize stack (#2600)
This commit is contained in:
parent
0a439fe52f
commit
9dc88f8a95
@ -8,6 +8,10 @@ use nu_protocol::{
|
|||||||
hir::{Block, ClassifiedCommand, Commands, InternalCommand},
|
hir::{Block, ClassifiedCommand, Commands, InternalCommand},
|
||||||
Dictionary, Scope, Signature, SyntaxShape, UntaggedValue, Value,
|
Dictionary, Scope, Signature, SyntaxShape, UntaggedValue, Value,
|
||||||
};
|
};
|
||||||
|
use rand::{
|
||||||
|
distributions::Alphanumeric,
|
||||||
|
prelude::{thread_rng, Rng},
|
||||||
|
};
|
||||||
use std::convert::TryInto;
|
use std::convert::TryInto;
|
||||||
use std::time::{Duration, Instant};
|
use std::time::{Duration, Instant};
|
||||||
|
|
||||||
@ -79,20 +83,16 @@ async fn benchmark(
|
|||||||
let scope = raw_args.call_info.scope.clone();
|
let scope = raw_args.call_info.scope.clone();
|
||||||
let (BenchmarkArgs { block, passthrough }, input) = raw_args.process(®istry).await?;
|
let (BenchmarkArgs { block, passthrough }, input) = raw_args.process(®istry).await?;
|
||||||
|
|
||||||
|
let mut env = scope.env.clone();
|
||||||
|
let name = generate_free_name(&env);
|
||||||
|
env.insert(name, generate_random_env_value());
|
||||||
|
|
||||||
let start_time = Instant::now();
|
let start_time = Instant::now();
|
||||||
|
|
||||||
#[cfg(feature = "rich-benchmark")]
|
#[cfg(feature = "rich-benchmark")]
|
||||||
let start = time().await;
|
let start = time().await;
|
||||||
|
|
||||||
let result = run_block(
|
let result = run_block(&block, &mut context, input, &scope.it, &scope.vars, &env).await;
|
||||||
&block,
|
|
||||||
&mut context,
|
|
||||||
input,
|
|
||||||
&scope.it,
|
|
||||||
&scope.vars,
|
|
||||||
&scope.env,
|
|
||||||
)
|
|
||||||
.await;
|
|
||||||
let output = result?.into_vec().await;
|
let output = result?.into_vec().await;
|
||||||
|
|
||||||
#[cfg(feature = "rich-benchmark")]
|
#[cfg(feature = "rich-benchmark")]
|
||||||
@ -200,3 +200,19 @@ fn into_big_int<T: TryInto<Duration>>(time: T) -> BigInt {
|
|||||||
.as_nanos()
|
.as_nanos()
|
||||||
.into()
|
.into()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn generate_random_env_value() -> String {
|
||||||
|
let mut thread_rng = thread_rng();
|
||||||
|
let len = thread_rng.gen_range(1, 16 * 1024);
|
||||||
|
thread_rng.sample_iter(&Alphanumeric).take(len).collect()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn generate_free_name(env: &indexmap::IndexMap<String, String>) -> String {
|
||||||
|
let mut thread_rng = thread_rng();
|
||||||
|
loop {
|
||||||
|
let candidate_name = format!("NU_RANDOM_VALUE_{}", thread_rng.gen::<usize>());
|
||||||
|
if !env.contains_key(&candidate_name) {
|
||||||
|
return candidate_name;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user