From 5d94b8174d46024bcafed9d1b6ea27d541949ea9 Mon Sep 17 00:00:00 2001 From: Ethiraric Date: Tue, 30 Jan 2024 23:11:00 +0100 Subject: [PATCH] Add big string array bench generation. --- saphyr/examples/gen_large_yaml/gen.rs | 6 ++++++ saphyr/examples/gen_large_yaml/main.rs | 18 +++++++++++++++++- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/saphyr/examples/gen_large_yaml/gen.rs b/saphyr/examples/gen_large_yaml/gen.rs index b687371..2a7dffe 100644 --- a/saphyr/examples/gen_large_yaml/gen.rs +++ b/saphyr/examples/gen_large_yaml/gen.rs @@ -120,6 +120,12 @@ pub fn name(rng: &mut ThreadRng, len_lo: usize, len_hi: usize) -> String { ret } +/// Generate a set of words. +pub fn words(rng: &mut ThreadRng, words_lo: usize, words_hi: usize) -> String { + let nwords = rng.gen_range(words_lo..words_hi); + lipsum::lipsum_words_with_rng(rng.clone(), nwords).replace(|c| "-\'\",*:".contains(c), "") +} + /// Generate a lipsum text. /// /// Texts are composed of some paragraphs and empty lines between them. diff --git a/saphyr/examples/gen_large_yaml/main.rs b/saphyr/examples/gen_large_yaml/main.rs index 3d21c48..15d0c31 100644 --- a/saphyr/examples/gen_large_yaml/main.rs +++ b/saphyr/examples/gen_large_yaml/main.rs @@ -9,7 +9,7 @@ use rand::{rngs::ThreadRng, Rng}; fn main() -> std::fmt::Result { let mut s = String::new(); let mut g = Generator::new(); - g.gen_record_array(&mut s, 100_000, 100_001)?; + g.gen_strings_array(&mut s, 1_300_000, 1_300_001, 10, 40)?; println!("{s}"); Ok(()) } @@ -43,9 +43,25 @@ impl Generator { self.gen_array(writer, items_lo, items_hi, Generator::gen_record_object) } + /// Generate an array of strings. + fn gen_strings_array( + &mut self, + writer: &mut W, + items_lo: usize, + items_hi: usize, + words_lo: usize, + words_hi: usize, + ) -> std::fmt::Result { + self.gen_array(writer, items_lo, items_hi, |gen, writer| { + write!(writer, "{}", gen::words(&mut gen.rng, words_lo, words_hi)) + }) + } + /// Generate a YAML object/mapping containing a record. /// /// Fields are description, hash, version, home, repository and pdf. + /// The `description` field is a long string and puts a lot of weight in plain scalar / block + /// scalar parsing. fn gen_record_object(&mut self, writer: &mut W) -> std::fmt::Result { let mut fields = HashMap::>>::new(); fields.insert(