#[cfg(test)]
mod pixel_char_benchmarks {
extern crate test;
use smallvec::SmallVec;
use test::Bencher;
use crate::{PixelChar, RgbValue, TuiColor, TuiStyle};
type PixelCharSmallVec = SmallVec<[PixelChar; 8]>;
type PixelCharVec = Vec<PixelChar>;
#[allow(clippy::cast_possible_truncation)]
fn create_test_pixel_chars(count: usize) -> Vec<PixelChar> {
let mut chars = Vec::with_capacity(count);
for i in 0..count {
let ch = match i % 3 {
0 => PixelChar::PlainText {
display_char: ((i % 26) as u8 + b'a') as char,
maybe_style: Some(TuiStyle {
color_fg: Some(TuiColor::Rgb(RgbValue::from_u8(255, 255, 255))),
color_bg: Some(TuiColor::Rgb(RgbValue::from_u8(0, 0, 0))),
..Default::default()
}),
},
1 => PixelChar::PlainText {
display_char: ' ',
maybe_style: None,
},
_ => PixelChar::Spacer,
};
chars.push(ch);
}
chars
}
#[allow(clippy::cast_sign_loss)]
#[bench]
fn bench_smallvec_build_line_typical(b: &mut Bencher) {
b.iter(|| {
let mut line = PixelCharSmallVec::new();
for i in 0..80 {
let ch = PixelChar::PlainText {
display_char: ((i % 26) as u8 + b'a') as char,
maybe_style: None,
};
line.push(ch);
}
test::black_box(line)
});
}
#[allow(clippy::cast_sign_loss)]
#[bench]
fn bench_vec_build_line_typical(b: &mut Bencher) {
b.iter(|| {
let mut line = PixelCharVec::new();
for i in 0..80 {
let ch = PixelChar::PlainText {
display_char: ((i % 26) as u8 + b'a') as char,
maybe_style: None,
};
line.push(ch);
}
test::black_box(line)
});
}
#[allow(clippy::cast_sign_loss)]
#[bench]
fn bench_vec_with_capacity_build_line_typical(b: &mut Bencher) {
b.iter(|| {
let mut line = PixelCharVec::with_capacity(80);
for i in 0..80 {
let ch = PixelChar::PlainText {
display_char: ((i % 26) as u8 + b'a') as char,
maybe_style: None,
};
line.push(ch);
}
test::black_box(line)
});
}
#[bench]
fn bench_smallvec_random_access(b: &mut Bencher) {
let chars = create_test_pixel_chars(80);
b.iter(|| {
let mut line = PixelCharSmallVec::new();
for _ in 0..80 {
line.push(PixelChar::Spacer);
}
for (i, ch) in chars.iter().enumerate() {
if i < line.len() {
line[i] = *ch;
}
}
test::black_box(line)
});
}
#[bench]
fn bench_vec_random_access(b: &mut Bencher) {
let chars = create_test_pixel_chars(80);
b.iter(|| {
let mut line = PixelCharVec::new();
for _ in 0..80 {
line.push(PixelChar::Spacer);
}
for (i, ch) in chars.iter().enumerate() {
if i < line.len() {
line[i] = *ch;
}
}
test::black_box(line)
});
}
#[bench]
fn bench_vec_with_capacity_random_access(b: &mut Bencher) {
let chars = create_test_pixel_chars(80);
b.iter(|| {
let mut line = PixelCharVec::with_capacity(80);
for _ in 0..80 {
line.push(PixelChar::Spacer);
}
for (i, ch) in chars.iter().enumerate() {
if i < line.len() {
line[i] = *ch;
}
}
test::black_box(line)
});
}
#[bench]
fn bench_smallvec_extend(b: &mut Bencher) {
let chars = create_test_pixel_chars(40);
b.iter(|| {
let mut line = PixelCharSmallVec::new();
line.extend(chars.iter().copied());
line.extend(chars.iter().copied()); test::black_box(line)
});
}
#[bench]
fn bench_vec_extend(b: &mut Bencher) {
let chars = create_test_pixel_chars(40);
b.iter(|| {
let mut line = PixelCharVec::new();
line.extend(chars.iter().copied());
line.extend(chars.iter().copied());
test::black_box(line)
});
}
#[bench]
fn bench_vec_with_capacity_extend(b: &mut Bencher) {
let chars = create_test_pixel_chars(40);
b.iter(|| {
let mut line = PixelCharVec::with_capacity(80);
line.extend(chars.iter().copied());
line.extend(chars.iter().copied());
test::black_box(line)
});
}
#[bench]
fn bench_smallvec_clone(b: &mut Bencher) {
let mut line = PixelCharSmallVec::new();
for ch in create_test_pixel_chars(80) {
line.push(ch);
}
b.iter(|| test::black_box(line.clone()));
}
#[bench]
fn bench_vec_clone(b: &mut Bencher) {
let mut line = PixelCharVec::new();
for ch in create_test_pixel_chars(80) {
line.push(ch);
}
b.iter(|| test::black_box(line.clone()));
}
#[allow(clippy::cast_sign_loss )]
#[bench]
fn bench_smallvec_small_line(b: &mut Bencher) {
b.iter(|| {
let mut line = PixelCharSmallVec::new();
for i in 0..8 {
line.push(PixelChar::PlainText {
display_char: ((i % 26) as u8 + b'a') as char,
maybe_style: None,
});
}
test::black_box(line)
});
}
#[allow(clippy::cast_sign_loss)]
#[bench]
fn bench_vec_small_line(b: &mut Bencher) {
b.iter(|| {
let mut line = PixelCharVec::new();
for i in 0..8 {
line.push(PixelChar::PlainText {
display_char: ((i % 26) as u8 + b'a') as char,
maybe_style: None,
});
}
test::black_box(line)
});
}
#[bench]
fn bench_smallvec_iterate(b: &mut Bencher) {
let mut line = PixelCharSmallVec::new();
for ch in create_test_pixel_chars(80) {
line.push(ch);
}
b.iter(|| {
let mut count = 0;
for ch in &line {
match ch {
PixelChar::PlainText { display_char, .. } => {
count += *display_char as usize;
}
_ => count += 1,
}
}
test::black_box(count)
});
}
#[bench]
fn bench_vec_iterate(b: &mut Bencher) {
let mut line = PixelCharVec::new();
for ch in create_test_pixel_chars(80) {
line.push(ch);
}
b.iter(|| {
let mut count = 0;
for ch in &line {
match ch {
PixelChar::PlainText { display_char, .. } => {
count += *display_char as usize;
}
_ => count += 1,
}
}
test::black_box(count)
});
}
}