| #![feature(test)] |
| |
| // The benchmarks here verify that the complexity grows as O(*n*) |
| // where *n* is the number of characters in the text to be wrapped. |
| |
| #[cfg(feature = "hyphenation")] |
| extern crate hyphenation; |
| extern crate lipsum; |
| extern crate rand; |
| extern crate rand_xorshift; |
| extern crate test; |
| extern crate textwrap; |
| |
| #[cfg(feature = "hyphenation")] |
| use hyphenation::{Language, Load, Standard}; |
| use lipsum::MarkovChain; |
| use rand::SeedableRng; |
| use rand_xorshift::XorShiftRng; |
| use test::Bencher; |
| #[cfg(feature = "hyphenation")] |
| use textwrap::Wrapper; |
| |
| const LINE_LENGTH: usize = 60; |
| |
| /// Generate a lorem ipsum text with the given number of characters. |
| fn lorem_ipsum(length: usize) -> String { |
| // The average word length in the lorem ipsum text is somewhere |
| // between 6 and 7. So we conservatively divide by 5 to have a |
| // long enough text that we can truncate below. |
| let rng = XorShiftRng::seed_from_u64(0); |
| let mut chain = MarkovChain::new_with_rng(rng); |
| chain.learn(lipsum::LOREM_IPSUM); |
| chain.learn(lipsum::LIBER_PRIMUS); |
| |
| let mut text = chain.generate_from(length / 5, ("Lorem", "ipsum")); |
| text.truncate(length); |
| text |
| } |
| |
| #[bench] |
| fn fill_100(b: &mut Bencher) { |
| let text = &lorem_ipsum(100); |
| b.iter(|| textwrap::fill(text, LINE_LENGTH)) |
| } |
| |
| #[bench] |
| fn fill_200(b: &mut Bencher) { |
| let text = &lorem_ipsum(200); |
| b.iter(|| textwrap::fill(text, LINE_LENGTH)) |
| } |
| |
| #[bench] |
| fn fill_400(b: &mut Bencher) { |
| let text = &lorem_ipsum(400); |
| b.iter(|| textwrap::fill(text, LINE_LENGTH)) |
| } |
| |
| #[bench] |
| fn fill_800(b: &mut Bencher) { |
| let text = &lorem_ipsum(800); |
| b.iter(|| textwrap::fill(text, LINE_LENGTH)) |
| } |
| |
| #[bench] |
| fn wrap_100(b: &mut Bencher) { |
| let text = &lorem_ipsum(100); |
| b.iter(|| textwrap::wrap(text, LINE_LENGTH)) |
| } |
| |
| #[bench] |
| fn wrap_200(b: &mut Bencher) { |
| let text = &lorem_ipsum(200); |
| b.iter(|| textwrap::wrap(text, LINE_LENGTH)) |
| } |
| |
| #[bench] |
| fn wrap_400(b: &mut Bencher) { |
| let text = &lorem_ipsum(400); |
| b.iter(|| textwrap::wrap(text, LINE_LENGTH)) |
| } |
| |
| #[bench] |
| fn wrap_800(b: &mut Bencher) { |
| let text = &lorem_ipsum(800); |
| b.iter(|| textwrap::wrap(text, LINE_LENGTH)) |
| } |
| |
| #[bench] |
| #[cfg(feature = "hyphenation")] |
| fn hyphenation_fill_100(b: &mut Bencher) { |
| let text = &lorem_ipsum(100); |
| let dictionary = Standard::from_embedded(Language::Latin).unwrap(); |
| let wrapper = Wrapper::with_splitter(LINE_LENGTH, dictionary); |
| b.iter(|| wrapper.fill(text)) |
| } |
| |
| #[bench] |
| #[cfg(feature = "hyphenation")] |
| fn hyphenation_fill_200(b: &mut Bencher) { |
| let text = &lorem_ipsum(200); |
| let dictionary = Standard::from_embedded(Language::Latin).unwrap(); |
| let wrapper = Wrapper::with_splitter(LINE_LENGTH, dictionary); |
| b.iter(|| wrapper.fill(text)) |
| } |
| |
| #[bench] |
| #[cfg(feature = "hyphenation")] |
| fn hyphenation_fill_400(b: &mut Bencher) { |
| let text = &lorem_ipsum(400); |
| let dictionary = Standard::from_embedded(Language::Latin).unwrap(); |
| let wrapper = Wrapper::with_splitter(LINE_LENGTH, dictionary); |
| b.iter(|| wrapper.fill(text)) |
| } |
| |
| #[bench] |
| #[cfg(feature = "hyphenation")] |
| fn hyphenation_fill_800(b: &mut Bencher) { |
| let text = &lorem_ipsum(800); |
| let dictionary = Standard::from_embedded(Language::Latin).unwrap(); |
| let wrapper = Wrapper::with_splitter(LINE_LENGTH, dictionary); |
| b.iter(|| wrapper.fill(text)) |
| } |