feat: attempt to benchmark another implementation from crates.io

This commit is contained in:
nobody 2025-07-08 18:38:49 -07:00
commit 131d9f3cfe
Signed by: GrocerPublishAgent
GPG key ID: D460CD54A9E3AB86
4 changed files with 300 additions and 8 deletions

View file

@ -1,4 +1,6 @@
There is a test harness written in Java by the original paper authors There is a test harness written in Java by the original paper authors
https://github.com/Chat-Wane/LSEQ https://github.com/Chat-Wane/LSEQ
So far I cannot get my implementation to reproduce the numbers from the
Chat-Wane repo.
So far I cannot get my implementation to reproduce the numbers Another rust implementation is located at https://github.com/s-panferov/lseq/tree/master/src. I tried to benchmark it and discovered it does not build on aarch64

240
research/Cargo.lock generated
View file

@ -29,6 +29,12 @@ version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8"
[[package]]
name = "az"
version = "1.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7b7e4c2464d97fe331d41de9d5db0def0a96f4d823b8b32a2efd503578988973"
[[package]] [[package]]
name = "bumpalo" name = "bumpalo"
version = "3.19.0" version = "3.19.0"
@ -41,6 +47,12 @@ version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5"
[[package]]
name = "cfg-if"
version = "0.1.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822"
[[package]] [[package]]
name = "cfg-if" name = "cfg-if"
version = "1.0.1" version = "1.0.1"
@ -185,24 +197,40 @@ dependencies = [
"termcolor", "termcolor",
] ]
[[package]]
name = "fuchsia-cprng"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba"
[[package]] [[package]]
name = "getrandom" name = "getrandom"
version = "0.2.16" version = "0.2.16"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592"
dependencies = [ dependencies = [
"cfg-if", "cfg-if 1.0.1",
"libc", "libc",
"wasi", "wasi",
] ]
[[package]]
name = "gmp-mpfr-sys"
version = "1.6.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c66d61197a68f6323b9afa616cf83d55d69191e1bf364d4eb7d35ae18defe776"
dependencies = [
"libc",
"windows-sys",
]
[[package]] [[package]]
name = "half" name = "half"
version = "2.6.0" version = "2.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "459196ed295495a68f7d7fe1d84f6c4b7ff0e21fe3017b2f283c6fac3ad803c9" checksum = "459196ed295495a68f7d7fe1d84f6c4b7ff0e21fe3017b2f283c6fac3ad803c9"
dependencies = [ dependencies = [
"cfg-if", "cfg-if 1.0.1",
"crunchy", "crunchy",
] ]
@ -260,18 +288,108 @@ version = "0.2.174"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776" checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776"
[[package]]
name = "libm"
version = "0.2.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de"
[[package]] [[package]]
name = "log" name = "log"
version = "0.4.27" version = "0.4.27"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94"
[[package]]
name = "lseq"
version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1cfba8403d8bf2f22914ced01603c29c23f68660766609d20e0bdee746bafc16"
dependencies = [
"num",
"rand 0.4.6",
"rug",
"skiplist",
"uuid",
]
[[package]] [[package]]
name = "memchr" name = "memchr"
version = "2.7.5" version = "2.7.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0"
[[package]]
name = "num"
version = "0.1.43"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c9bdb1fb680e609c2e0930c1866cafdd0be7e7c7a1ecf92aec71ed8d99d3e133"
dependencies = [
"num-bigint",
"num-complex",
"num-integer",
"num-iter",
"num-rational",
"num-traits",
]
[[package]]
name = "num-bigint"
version = "0.1.45"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1357c02fa1d647dd0769ef5bc2bf86281f064231c09c192a46c71246e3ec9258"
dependencies = [
"autocfg",
"num-integer",
"num-traits",
"rand 0.4.6",
"rustc-serialize",
]
[[package]]
name = "num-complex"
version = "0.1.44"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "17cf384bef067563c44d41028840dbecc7f06f2aa5d7881a81dfb0fc7c72f202"
dependencies = [
"autocfg",
"num-traits",
"rustc-serialize",
]
[[package]]
name = "num-integer"
version = "0.1.46"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f"
dependencies = [
"num-traits",
]
[[package]]
name = "num-iter"
version = "0.1.45"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf"
dependencies = [
"autocfg",
"num-integer",
"num-traits",
]
[[package]]
name = "num-rational"
version = "0.1.43"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fbfff0773e8a07fb033d726b9ff1327466709820788e5298afce4d752965ff1e"
dependencies = [
"autocfg",
"num-bigint",
"num-integer",
"num-traits",
"rustc-serialize",
]
[[package]] [[package]]
name = "num-traits" name = "num-traits"
version = "0.2.19" version = "0.2.19"
@ -297,7 +415,7 @@ checksum = "d6790f58c7ff633d8771f42965289203411a5e5c68388703c06e14f24770b41e"
name = "peoplesgrocers-lseq" name = "peoplesgrocers-lseq"
version = "1.0.0" version = "1.0.0"
dependencies = [ dependencies = [
"rand", "rand 0.8.5",
] ]
[[package]] [[package]]
@ -307,8 +425,9 @@ dependencies = [
"criterion", "criterion",
"env_logger", "env_logger",
"log", "log",
"lseq",
"peoplesgrocers-lseq", "peoplesgrocers-lseq",
"rand", "rand 0.8.5",
] ]
[[package]] [[package]]
@ -366,6 +485,29 @@ dependencies = [
"proc-macro2", "proc-macro2",
] ]
[[package]]
name = "rand"
version = "0.3.23"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "64ac302d8f83c0c1974bf758f6b041c6c8ada916fbb44a609158ca8b064cc76c"
dependencies = [
"libc",
"rand 0.4.6",
]
[[package]]
name = "rand"
version = "0.4.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "552840b97013b1a26992c11eac34bdd778e464601a4c2054b5f0bff7c6761293"
dependencies = [
"fuchsia-cprng",
"libc",
"rand_core 0.3.1",
"rdrand",
"winapi",
]
[[package]] [[package]]
name = "rand" name = "rand"
version = "0.8.5" version = "0.8.5"
@ -374,7 +516,7 @@ checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
dependencies = [ dependencies = [
"libc", "libc",
"rand_chacha", "rand_chacha",
"rand_core", "rand_core 0.6.4",
] ]
[[package]] [[package]]
@ -384,9 +526,24 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
dependencies = [ dependencies = [
"ppv-lite86", "ppv-lite86",
"rand_core", "rand_core 0.6.4",
] ]
[[package]]
name = "rand_core"
version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b"
dependencies = [
"rand_core 0.4.2",
]
[[package]]
name = "rand_core"
version = "0.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc"
[[package]] [[package]]
name = "rand_core" name = "rand_core"
version = "0.6.4" version = "0.6.4"
@ -416,6 +573,15 @@ dependencies = [
"crossbeam-utils", "crossbeam-utils",
] ]
[[package]]
name = "rdrand"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2"
dependencies = [
"rand_core 0.3.1",
]
[[package]] [[package]]
name = "regex" name = "regex"
version = "1.11.1" version = "1.11.1"
@ -445,6 +611,24 @@ version = "0.8.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c"
[[package]]
name = "rug"
version = "1.27.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4207e8d668e5b8eb574bda8322088ccd0d7782d3d03c7e8d562e82ed82bdcbc3"
dependencies = [
"az",
"gmp-mpfr-sys",
"libc",
"libm",
]
[[package]]
name = "rustc-serialize"
version = "0.3.25"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fe834bc780604f4674073badbad26d7219cadfb4a2275802db12cbae17498401"
[[package]] [[package]]
name = "rustversion" name = "rustversion"
version = "1.0.21" version = "1.0.21"
@ -498,6 +682,15 @@ dependencies = [
"serde", "serde",
] ]
[[package]]
name = "skiplist"
version = "0.2.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b7737ee2f6e789525feac28c4c3e3bb9216feb409bc4b90ce29970de6448eb94"
dependencies = [
"rand 0.3.23",
]
[[package]] [[package]]
name = "syn" name = "syn"
version = "2.0.104" version = "2.0.104"
@ -534,6 +727,17 @@ version = "1.0.18"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512"
[[package]]
name = "uuid"
version = "0.6.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e1436e58182935dcd9ce0add9ea0b558e8a87befe01c1a301e6020aeb0876363"
dependencies = [
"cfg-if 0.1.10",
"rand 0.4.6",
"serde",
]
[[package]] [[package]]
name = "walkdir" name = "walkdir"
version = "2.5.0" version = "2.5.0"
@ -556,7 +760,7 @@ version = "0.2.100"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5"
dependencies = [ dependencies = [
"cfg-if", "cfg-if 1.0.1",
"once_cell", "once_cell",
"rustversion", "rustversion",
"wasm-bindgen-macro", "wasm-bindgen-macro",
@ -618,6 +822,22 @@ dependencies = [
"wasm-bindgen", "wasm-bindgen",
] ]
[[package]]
name = "winapi"
version = "0.3.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
dependencies = [
"winapi-i686-pc-windows-gnu",
"winapi-x86_64-pc-windows-gnu",
]
[[package]]
name = "winapi-i686-pc-windows-gnu"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
[[package]] [[package]]
name = "winapi-util" name = "winapi-util"
version = "0.1.9" version = "0.1.9"
@ -627,6 +847,12 @@ dependencies = [
"windows-sys", "windows-sys",
] ]
[[package]]
name = "winapi-x86_64-pc-windows-gnu"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
[[package]] [[package]]
name = "windows-sys" name = "windows-sys"
version = "0.59.0" version = "0.59.0"

View file

@ -9,6 +9,14 @@ rand = "0.8"
log = "0.4" log = "0.4"
env_logger = "0.10" env_logger = "0.10"
# Target-specific dependencies
[target.'cfg(target_arch = "x86_64")'.dependencies]
# lseq is an implementation from 2018 that uses `rug` for arbitrary precision arithmetic
# It is not a great implementation because it requires building libgmp. Also it requires GPL libraries
# I learned that it might be desirable to change that crate to use https://github.com/cmpute/dashu/blob/HEAD/README.md
# which is a pure rust port of GNU GMP + MPFR
lseq = "0.1"
[dev-dependencies] [dev-dependencies]
criterion = "0.5" criterion = "0.5"

View file

@ -4,6 +4,10 @@ use peoplesgrocers_lseq::{SortKey, LSEQ};
use peoplesgrocers_lseq_research::algorithms::lseq_base64::{LSEQBase64, SortKeyBase64}; use peoplesgrocers_lseq_research::algorithms::lseq_base64::{LSEQBase64, SortKeyBase64};
use rand::{Rng, rngs::StdRng, SeedableRng}; use rand::{Rng, rngs::StdRng, SeedableRng};
use std::collections::VecDeque; use std::collections::VecDeque;
// Add lseq crate from crates.io (uses arbitrary precision arithmetic)
// This crate does not compile on arm
#[cfg(target_arch = "x86_64")]
use lseq::{LSEQ as LSEQArbitraryPrecision, Ident};
fn benchmark_sequential_insertions(c: &mut Criterion) { fn benchmark_sequential_insertions(c: &mut Criterion) {
let mut group = c.benchmark_group("sequential_insertions"); let mut group = c.benchmark_group("sequential_insertions");
@ -68,6 +72,28 @@ fn benchmark_sequential_insertions(c: &mut Criterion) {
}); });
}, },
); );
// Benchmark lseq crate from crates.io (arbitrary precision arithmetic)
#[cfg(target_arch = "x86_64")]
group.bench_with_input(
BenchmarkId::new("arbitrary_precision", size),
size,
|b, &size| {
b.iter(|| {
let mut lseq = LSEQArbitraryPrecision::new();
let mut keys = Vec::new();
for _ in 0..size {
let before = keys.last();
let after = None;
let key = lseq.allocate(before, after);
keys.push(key);
}
black_box(keys);
});
},
);
} }
group.finish(); group.finish();
@ -163,6 +189,36 @@ fn benchmark_random_insertions(c: &mut Criterion) {
}); });
}, },
); );
// Benchmark lseq crate from crates.io (arbitrary precision arithmetic)
#[cfg(target_arch = "x86_64")]
group.bench_with_input(
BenchmarkId::new("arbitrary_precision", size),
size,
|b, &size| {
b.iter(|| {
let mut lseq = LSEQArbitraryPrecision::new();
let mut keys = Vec::new();
let mut rng = StdRng::seed_from_u64(123);
for _ in 0..size {
if keys.is_empty() {
let key = lseq.allocate(None, None);
keys.push(key);
} else {
let idx = rng.gen_range(0..keys.len());
let before = if idx == 0 { None } else { Some(&keys[idx - 1]) };
let after = if idx == keys.len() { None } else { Some(&keys[idx]) };
let key = lseq.allocate(before, after);
keys.insert(idx, key);
}
}
black_box(keys);
});
},
);
} }
group.finish(); group.finish();