summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEllie Huxtable <ellie@elliehuxtable.com>2024-06-26 12:40:17 +0100
committerGitHub <noreply@github.com>2024-06-26 12:40:17 +0100
commit1201caee5c7b3020e1c879e527feb934fd1d8023 (patch)
tree5af6ecc78075401e459c97b65f74689e141d5137
parentfd3aca7cb3394d895d27e8cea26a02948b06d6f1 (diff)
perf(search): benchmark smart sort (#2202)
-rw-r--r--Cargo.lock51
-rw-r--r--crates/atuin-history/Cargo.toml9
-rw-r--r--crates/atuin-history/benches/smart_sort.rs35
-rw-r--r--crates/atuin-history/src/lib.rs1
-rw-r--r--crates/atuin-history/src/sort.rs (renamed from crates/atuin/src/command/client/search/sort.rs)0
-rw-r--r--crates/atuin/src/command/client/search.rs1
-rw-r--r--crates/atuin/src/command/client/search/interactive.rs6
7 files changed, 100 insertions, 3 deletions
diff --git a/Cargo.lock b/Cargo.lock
index 5e13ef789..939dd894e 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -370,6 +370,7 @@ dependencies = [
"base64 0.22.1",
"crossterm",
"directories",
+ "divan",
"eyre",
"fs-err",
"futures-util",
@@ -377,6 +378,7 @@ dependencies = [
"interim",
"itertools 0.12.1",
"log",
+ "rand",
"semver",
"serde",
"serde_json",
@@ -384,6 +386,7 @@ dependencies = [
"time",
"tokio",
"tracing",
+ "tracing-tree",
"unicode-segmentation",
"unicode-width",
"uuid",
@@ -765,6 +768,7 @@ dependencies = [
"anstyle",
"clap_lex",
"strsim",
+ "terminal_size",
]
[[package]]
@@ -859,6 +863,12 @@ dependencies = [
]
[[package]]
+name = "condtype"
+version = "1.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "baf0a07a401f374238ab8e2f11a104d2851bf9ce711ec69804834de8af45c7af"
+
+[[package]]
name = "config"
version = "0.13.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1173,6 +1183,31 @@ dependencies = [
]
[[package]]
+name = "divan"
+version = "0.1.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a0d567df2c9c2870a43f3f2bd65aaeb18dbce1c18f217c3e564b4fbaeb3ee56c"
+dependencies = [
+ "cfg-if",
+ "clap",
+ "condtype",
+ "divan-macros",
+ "libc",
+ "regex-lite",
+]
+
+[[package]]
+name = "divan-macros"
+version = "0.1.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "27540baf49be0d484d8f0130d7d8da3011c32a44d4fc873368154f1510e574a2"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.66",
+]
+
+[[package]]
name = "dotenvy"
version = "0.15.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -2945,6 +2980,12 @@ dependencies = [
]
[[package]]
+name = "regex-lite"
+version = "0.1.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "53a49587ad06b26609c52e423de037e7f57f20d53535d66e08c695f347df952a"
+
+[[package]]
name = "regex-syntax"
version = "0.6.29"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -3889,6 +3930,16 @@ dependencies = [
]
[[package]]
+name = "terminal_size"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "21bebf2b7c9e0a515f6e0f8c51dc0f8e4696391e6f1ff30379559f8365fb0df7"
+dependencies = [
+ "rustix",
+ "windows-sys 0.48.0",
+]
+
+[[package]]
name = "thiserror"
version = "1.0.61"
source = "registry+https://github.com/rust-lang/crates.io-index"
diff --git a/crates/atuin-history/Cargo.toml b/crates/atuin-history/Cargo.toml
index 4836cf749..2ed0e1a58 100644
--- a/crates/atuin-history/Cargo.toml
+++ b/crates/atuin-history/Cargo.toml
@@ -39,3 +39,12 @@ tracing = "0.1"
uuid = { workspace = true }
unicode-segmentation = "1.11.0"
sysinfo = "0.30.7"
+
+[dev-dependencies]
+tracing-tree = "0.3"
+divan = "0.1.14"
+rand = { workspace = true }
+
+[[bench]]
+name = "smart_sort"
+harness = false
diff --git a/crates/atuin-history/benches/smart_sort.rs b/crates/atuin-history/benches/smart_sort.rs
new file mode 100644
index 000000000..a78064de7
--- /dev/null
+++ b/crates/atuin-history/benches/smart_sort.rs
@@ -0,0 +1,35 @@
+use atuin_client::history::History;
+use atuin_history::sort::sort;
+
+use rand::Rng;
+
+fn main() {
+ // Run registered benchmarks.
+ divan::main();
+}
+
+// Smart sort usually runs on 200 entries, test on a few sizes
+#[divan::bench(args=[100, 200, 400, 800, 1600, 10000])]
+fn smart_sort(lines: usize) {
+ // benchmark a few different sizes of "history"
+ // first we need to generate some history. This will use a whole bunch of memory, sorry
+ let mut rng = rand::thread_rng();
+ let now = time::OffsetDateTime::now_utc().unix_timestamp();
+
+ let possible_commands = ["echo", "ls", "cd", "grep", "atuin", "curl"];
+ let mut commands = Vec::<History>::with_capacity(lines);
+
+ for _ in 0..lines {
+ let command = possible_commands[rng.gen_range(0..possible_commands.len())];
+
+ let command = History::import()
+ .command(command)
+ .timestamp(time::OffsetDateTime::from_unix_timestamp(rng.gen_range(0..now)).unwrap())
+ .build()
+ .into();
+
+ commands.push(command);
+ }
+
+ let _ = sort("curl", commands);
+}
diff --git a/crates/atuin-history/src/lib.rs b/crates/atuin-history/src/lib.rs
index 9d34677fc..e7b33916f 100644
--- a/crates/atuin-history/src/lib.rs
+++ b/crates/atuin-history/src/lib.rs
@@ -1 +1,2 @@
+pub mod sort;
pub mod stats;
diff --git a/crates/atuin/src/command/client/search/sort.rs b/crates/atuin-history/src/sort.rs
index 4465a1422..4465a1422 100644
--- a/crates/atuin/src/command/client/search/sort.rs
+++ b/crates/atuin-history/src/sort.rs
diff --git a/crates/atuin/src/command/client/search.rs b/crates/atuin/src/command/client/search.rs
index f645d26b0..f3626afe4 100644
--- a/crates/atuin/src/command/client/search.rs
+++ b/crates/atuin/src/command/client/search.rs
@@ -21,7 +21,6 @@ mod engines;
mod history_list;
mod inspector;
mod interactive;
-mod sort;
pub use duration::format_duration_into;
diff --git a/crates/atuin/src/command/client/search/interactive.rs b/crates/atuin/src/command/client/search/interactive.rs
index de0f4ea12..1676345bc 100644
--- a/crates/atuin/src/command/client/search/interactive.rs
+++ b/crates/atuin/src/command/client/search/interactive.rs
@@ -31,7 +31,6 @@ use super::{
cursor::Cursor,
engines::{SearchEngine, SearchState},
history_list::{HistoryList, ListState, PREFIX_LENGTH},
- sort,
};
use crate::{command::client::search::engines, VERSION};
@@ -96,7 +95,10 @@ impl State {
self.results_len = results.len();
if smart_sort {
- Ok(sort::sort(self.search.input.as_str(), results))
+ Ok(atuin_history::sort::sort(
+ self.search.input.as_str(),
+ results,
+ ))
} else {
Ok(results)
}