diff --git a/research/.plan b/research/.plan index 0a73b97..902e0d1 100644 --- a/research/.plan +++ b/research/.plan @@ -1,4 +1,6 @@ There is a test harness written in Java by the original paper authors 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 diff --git a/research/Cargo.lock b/research/Cargo.lock index 6ffa44f..20b1bdf 100644 --- a/research/Cargo.lock +++ b/research/Cargo.lock @@ -29,6 +29,12 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" +[[package]] +name = "az" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b7e4c2464d97fe331d41de9d5db0def0a96f4d823b8b32a2efd503578988973" + [[package]] name = "bumpalo" version = "3.19.0" @@ -41,6 +47,12 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" +[[package]] +name = "cfg-if" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" + [[package]] name = "cfg-if" version = "1.0.1" @@ -185,24 +197,40 @@ dependencies = [ "termcolor", ] +[[package]] +name = "fuchsia-cprng" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" + [[package]] name = "getrandom" version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" dependencies = [ - "cfg-if", + "cfg-if 1.0.1", "libc", "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]] name = "half" version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "459196ed295495a68f7d7fe1d84f6c4b7ff0e21fe3017b2f283c6fac3ad803c9" dependencies = [ - "cfg-if", + "cfg-if 1.0.1", "crunchy", ] @@ -260,18 +288,108 @@ version = "0.2.174" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776" +[[package]] +name = "libm" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" + [[package]] name = "log" version = "0.4.27" source = "registry+https://github.com/rust-lang/crates.io-index" 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]] name = "memchr" version = "2.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" 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]] name = "num-traits" version = "0.2.19" @@ -297,7 +415,7 @@ checksum = "d6790f58c7ff633d8771f42965289203411a5e5c68388703c06e14f24770b41e" name = "peoplesgrocers-lseq" version = "1.0.0" dependencies = [ - "rand", + "rand 0.8.5", ] [[package]] @@ -307,8 +425,9 @@ dependencies = [ "criterion", "env_logger", "log", + "lseq", "peoplesgrocers-lseq", - "rand", + "rand 0.8.5", ] [[package]] @@ -366,6 +485,29 @@ dependencies = [ "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]] name = "rand" version = "0.8.5" @@ -374,7 +516,7 @@ checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", "rand_chacha", - "rand_core", + "rand_core 0.6.4", ] [[package]] @@ -384,9 +526,24 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ "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]] name = "rand_core" version = "0.6.4" @@ -416,6 +573,15 @@ dependencies = [ "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]] name = "regex" version = "1.11.1" @@ -445,6 +611,24 @@ version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" 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]] name = "rustversion" version = "1.0.21" @@ -498,6 +682,15 @@ dependencies = [ "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]] name = "syn" version = "2.0.104" @@ -534,6 +727,17 @@ version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" 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]] name = "walkdir" version = "2.5.0" @@ -556,7 +760,7 @@ version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" dependencies = [ - "cfg-if", + "cfg-if 1.0.1", "once_cell", "rustversion", "wasm-bindgen-macro", @@ -618,6 +822,22 @@ dependencies = [ "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]] name = "winapi-util" version = "0.1.9" @@ -627,6 +847,12 @@ dependencies = [ "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]] name = "windows-sys" version = "0.59.0" diff --git a/research/Cargo.toml b/research/Cargo.toml index d5f76a8..57c4196 100644 --- a/research/Cargo.toml +++ b/research/Cargo.toml @@ -9,6 +9,14 @@ rand = "0.8" log = "0.4" 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] criterion = "0.5" diff --git a/research/benches/lseq_benchmarks.rs b/research/benches/lseq_benchmarks.rs index f81c90a..ad87172 100644 --- a/research/benches/lseq_benchmarks.rs +++ b/research/benches/lseq_benchmarks.rs @@ -4,6 +4,10 @@ use peoplesgrocers_lseq::{SortKey, LSEQ}; use peoplesgrocers_lseq_research::algorithms::lseq_base64::{LSEQBase64, SortKeyBase64}; use rand::{Rng, rngs::StdRng, SeedableRng}; 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) { 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(); @@ -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();