diff --git a/benches/benchmarks.rs b/benches/benchmarks.rs index d6581bc255..eb8d448660 100644 --- a/benches/benchmarks.rs +++ b/benches/benchmarks.rs @@ -1,7 +1,6 @@ use nu_cli::{eval_source, evaluate_commands}; use nu_plugin_core::{Encoder, EncodingType}; use nu_plugin_protocol::{PluginCallResponse, PluginOutput}; - use nu_protocol::{ engine::{EngineState, Stack}, PipelineData, Signals, Span, Spanned, Value, @@ -9,12 +8,11 @@ use nu_protocol::{ use nu_std::load_standard_library; use nu_utils::{get_default_config, get_default_env}; use std::{ + fmt::Write, + hint::black_box, rc::Rc, sync::{atomic::AtomicBool, Arc}, }; - -use std::hint::black_box; - use tango_bench::{benchmark_fn, tango_benchmarks, tango_main, IntoBenchmarks}; fn load_bench_commands() -> EngineState { @@ -141,19 +139,16 @@ fn bench_load_standard_lib() -> impl IntoBenchmarks { })] } -fn create_flat_record_string(n: i32) -> String { - let mut s = String::from("let record = {"); +fn create_flat_record_string(n: usize) -> String { + let mut s = String::from("let record = { "); for i in 0..n { - s.push_str(&format!("col_{}: {}", i, i)); - if i < n - 1 { - s.push_str(", "); - } + write!(s, "col_{i}: {i}, ").unwrap(); } s.push('}'); s } -fn create_nested_record_string(depth: i32) -> String { +fn create_nested_record_string(depth: usize) -> String { let mut s = String::from("let record = {"); for _ in 0..depth { s.push_str("col: {"); @@ -166,7 +161,7 @@ fn create_nested_record_string(depth: i32) -> String { s } -fn create_example_table_nrows(n: i32) -> String { +fn create_example_table_nrows(n: usize) -> String { let mut s = String::from("let table = [[foo bar baz]; "); for i in 0..n { s.push_str(&format!("[0, 1, {i}]")); @@ -178,7 +173,7 @@ fn create_example_table_nrows(n: i32) -> String { s } -fn bench_record_create(n: i32) -> impl IntoBenchmarks { +fn bench_record_create(n: usize) -> impl IntoBenchmarks { bench_command( &format!("record_create_{n}"), &create_flat_record_string(n), @@ -187,7 +182,7 @@ fn bench_record_create(n: i32) -> impl IntoBenchmarks { ) } -fn bench_record_flat_access(n: i32) -> impl IntoBenchmarks { +fn bench_record_flat_access(n: usize) -> impl IntoBenchmarks { let setup_command = create_flat_record_string(n); let (stack, engine) = setup_stack_and_engine_from_command(&setup_command); bench_command( @@ -198,10 +193,10 @@ fn bench_record_flat_access(n: i32) -> impl IntoBenchmarks { ) } -fn bench_record_nested_access(n: i32) -> impl IntoBenchmarks { +fn bench_record_nested_access(n: usize) -> impl IntoBenchmarks { let setup_command = create_nested_record_string(n); let (stack, engine) = setup_stack_and_engine_from_command(&setup_command); - let nested_access = ".col".repeat(n as usize); + let nested_access = ".col".repeat(n); bench_command( &format!("record_nested_access_{n}"), &format!("$record{} | ignore", nested_access), @@ -210,7 +205,18 @@ fn bench_record_nested_access(n: i32) -> impl IntoBenchmarks { ) } -fn bench_table_create(n: i32) -> impl IntoBenchmarks { +fn bench_record_insert(n: usize, m: usize) -> impl IntoBenchmarks { + let setup_command = create_flat_record_string(n); + let (stack, engine) = setup_stack_and_engine_from_command(&setup_command); + let mut insert = String::from("$record"); + for i in n..(n + m) { + write!(insert, " | insert col_{i} {i}").unwrap(); + } + insert.push_str(" | ignore"); + bench_command(&format!("record_insert_{n}_{m}"), &insert, stack, engine) +} + +fn bench_table_create(n: usize) -> impl IntoBenchmarks { bench_command( &format!("table_create_{n}"), &create_example_table_nrows(n), @@ -219,7 +225,7 @@ fn bench_table_create(n: i32) -> impl IntoBenchmarks { ) } -fn bench_table_get(n: i32) -> impl IntoBenchmarks { +fn bench_table_get(n: usize) -> impl IntoBenchmarks { let setup_command = create_example_table_nrows(n); let (stack, engine) = setup_stack_and_engine_from_command(&setup_command); bench_command( @@ -230,7 +236,7 @@ fn bench_table_get(n: i32) -> impl IntoBenchmarks { ) } -fn bench_table_select(n: i32) -> impl IntoBenchmarks { +fn bench_table_select(n: usize) -> impl IntoBenchmarks { let setup_command = create_example_table_nrows(n); let (stack, engine) = setup_stack_and_engine_from_command(&setup_command); bench_command( @@ -241,7 +247,29 @@ fn bench_table_select(n: i32) -> impl IntoBenchmarks { ) } -fn bench_eval_interleave(n: i32) -> impl IntoBenchmarks { +fn bench_table_insert_row(n: usize, m: usize) -> impl IntoBenchmarks { + let setup_command = create_example_table_nrows(n); + let (stack, engine) = setup_stack_and_engine_from_command(&setup_command); + let mut insert = String::from("$table"); + for i in n..(n + m) { + write!(insert, " | insert {i} {{ foo: 0, bar: 1, baz: {i} }}").unwrap(); + } + insert.push_str(" | ignore"); + bench_command(&format!("table_insert_row_{n}_{m}"), &insert, stack, engine) +} + +fn bench_table_insert_col(n: usize, m: usize) -> impl IntoBenchmarks { + let setup_command = create_example_table_nrows(n); + let (stack, engine) = setup_stack_and_engine_from_command(&setup_command); + let mut insert = String::from("$table"); + for i in 0..m { + write!(insert, " | insert col_{i} {i}").unwrap(); + } + insert.push_str(" | ignore"); + bench_command(&format!("table_insert_col_{n}_{m}"), &insert, stack, engine) +} + +fn bench_eval_interleave(n: usize) -> impl IntoBenchmarks { let engine = setup_engine(); let stack = Stack::new(); bench_command( @@ -252,7 +280,7 @@ fn bench_eval_interleave(n: i32) -> impl IntoBenchmarks { ) } -fn bench_eval_interleave_with_interrupt(n: i32) -> impl IntoBenchmarks { +fn bench_eval_interleave_with_interrupt(n: usize) -> impl IntoBenchmarks { let mut engine = setup_engine(); engine.set_signals(Signals::new(Arc::new(AtomicBool::new(false)))); let stack = Stack::new(); @@ -264,7 +292,7 @@ fn bench_eval_interleave_with_interrupt(n: i32) -> impl IntoBenchmarks { ) } -fn bench_eval_for(n: i32) -> impl IntoBenchmarks { +fn bench_eval_for(n: usize) -> impl IntoBenchmarks { let engine = setup_engine(); let stack = Stack::new(); bench_command( @@ -275,7 +303,7 @@ fn bench_eval_for(n: i32) -> impl IntoBenchmarks { ) } -fn bench_eval_each(n: i32) -> impl IntoBenchmarks { +fn bench_eval_each(n: usize) -> impl IntoBenchmarks { let engine = setup_engine(); let stack = Stack::new(); bench_command( @@ -286,7 +314,7 @@ fn bench_eval_each(n: i32) -> impl IntoBenchmarks { ) } -fn bench_eval_par_each(n: i32) -> impl IntoBenchmarks { +fn bench_eval_par_each(n: usize) -> impl IntoBenchmarks { let engine = setup_engine(); let stack = Stack::new(); bench_command( @@ -427,6 +455,14 @@ tango_benchmarks!( bench_record_nested_access(32), bench_record_nested_access(64), bench_record_nested_access(128), + bench_record_insert(1, 1), + bench_record_insert(10, 1), + bench_record_insert(100, 1), + bench_record_insert(1000, 1), + bench_record_insert(1, 10), + bench_record_insert(10, 10), + bench_record_insert(100, 10), + bench_record_insert(1000, 10), // Table bench_table_create(1), bench_table_create(10), @@ -440,6 +476,22 @@ tango_benchmarks!( bench_table_select(10), bench_table_select(100), bench_table_select(1_000), + bench_table_insert_row(1, 1), + bench_table_insert_row(10, 1), + bench_table_insert_row(100, 1), + bench_table_insert_row(1000, 1), + bench_table_insert_row(1, 10), + bench_table_insert_row(10, 10), + bench_table_insert_row(100, 10), + bench_table_insert_row(1000, 10), + bench_table_insert_col(1, 1), + bench_table_insert_col(10, 1), + bench_table_insert_col(100, 1), + bench_table_insert_col(1000, 1), + bench_table_insert_col(1, 10), + bench_table_insert_col(10, 10), + bench_table_insert_col(100, 10), + bench_table_insert_col(1000, 10), // Eval // Interleave bench_eval_interleave(100),