From 64fdb377dc957bba3f3f6fd37700a1d159a58630 Mon Sep 17 00:00:00 2001 From: Paul Delafosse Date: Fri, 13 May 2022 11:12:20 +0200 Subject: [PATCH] perf: refine benches and add somes test to ensure we are testing the correct inputs --- benches/simple_lookup.rs | 51 +++++++++++++------ benches/tests.rs | 106 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 141 insertions(+), 16 deletions(-) create mode 100644 benches/tests.rs diff --git a/benches/simple_lookup.rs b/benches/simple_lookup.rs index 809f15b..7c83379 100644 --- a/benches/simple_lookup.rs +++ b/benches/simple_lookup.rs @@ -1,5 +1,6 @@ use criterion::{ - criterion_group, criterion_main, AxisScale, BenchmarkId, Criterion, PlotConfiguration, + black_box, criterion_group, criterion_main, AxisScale, BenchmarkId, Criterion, + PlotConfiguration, }; use freedesktop_icons::lookup; use gtk4::{IconLookupFlags, IconTheme, TextDirection}; @@ -10,42 +11,60 @@ pub fn bench_lookups(c: &mut Criterion) { group.plot_config(plot_config); let args = [ - "user-home", // (Best case) An icon that can be found in the current theme - "video-single-display-symbolic", // An icon that can be found in the parent theme - "firefox", // An icon that can be found in the hicolor default theme + "user-home", // (Best case) An icon that can be found in the current theme + "firefox", // An icon that can be found in the hicolor default theme "archlinux-logo", // An icon that resides in /usr/share/pixmaps - "not-found", // (Worst case) An icon that does not exist + "not-found", // (Worst case) An icon that does not exist ]; for arg in args { group.bench_with_input(BenchmarkId::new("freedesktop-icons", arg), arg, |b, arg| { - b.iter(|| lookup(arg).with_theme("Arc").find()); + b.iter(|| { + lookup(black_box(arg)) + .with_theme(black_box("Adwaita")) + .find() + }); }); group.bench_with_input( BenchmarkId::new("freedesktop-icons-cache", arg), arg, |b, arg| { - b.iter(|| lookup(arg).with_theme("Arc").with_cache().find()); + b.iter(|| { + lookup(black_box(arg)) + .with_scale(black_box(1)) + .with_size(black_box(24)) + .with_theme(black_box("Adwaita")) + .with_cache() + .find() + }); }, ); group.bench_with_input(BenchmarkId::new("linicon", arg), arg, |b, arg| { - b.iter(|| linicon::lookup_icon(arg).from_theme("Arc").next()); + b.iter(|| { + linicon::lookup_icon(black_box(arg)) + .from_theme(black_box("Adwaita")) + .with_scale(black_box(1)) + .with_size(black_box(24)) + .next() + }); }); group.bench_with_input(BenchmarkId::new("gtk", arg), arg, |b, arg| { gtk4::init().unwrap(); let theme = IconTheme::new(); b.iter(|| { - theme.lookup_icon( - arg, - &[], - 24, - 1, - TextDirection::None, - IconLookupFlags::empty(), - ) + theme + .lookup_icon( + black_box(arg), + black_box(&[]), + black_box(24), + black_box(1), + black_box(TextDirection::None), + black_box(IconLookupFlags::empty()), + ) + .icon_name() }); }); } diff --git a/benches/tests.rs b/benches/tests.rs new file mode 100644 index 0000000..cd00477 --- /dev/null +++ b/benches/tests.rs @@ -0,0 +1,106 @@ +use freedesktop_icons::lookup; +use gtk4::{IconLookupFlags, IconTheme, TextDirection}; +use speculoos::prelude::*; +use std::path::PathBuf; + +#[test] +fn gtk_lookup() { + gtk4::init().unwrap(); + let theme = IconTheme::new(); + + let x = theme.lookup_icon( + "firefox", + &[], + 24, + 1, + TextDirection::None, + IconLookupFlags::empty(), + ); + + assert!(x.icon_name().is_some()) +} + +// Linicon sometimes fails with theme that have unknown parents +// This test only ensure we are running the correct function in the benchmarks +// And results are identical. +#[test] +fn linicon() { + // Current theme + let lin_user_home = linicon::lookup_icon("user-home") + .from_theme("Adwaita") + .with_size(24) + .with_scale(1) + .next(); + + let user_home = lookup("user-home") + .with_theme("Adwaita") + .with_size(24) + .with_scale(1) + .find(); + + asserting!("Linicon return some icon") + .that(&lin_user_home.unwrap()) + .is_ok() + .map(|icon| &icon.path) + .is_equal_to(PathBuf::from( + "/usr/share/icons/Adwaita/24x24/places/user-home.png", + )); + + // Fixme + asserting!("Our implementation should return the same result as linicon") + .that(&user_home) + .is_some() + .is_equal_to(PathBuf::from( + "/usr/share/icons/Adwaita/24x24/places/user-home.png", + )); + + // Fallback to hicolor + let lin_firefox = linicon::lookup_icon("firefox") + .from_theme("Adwaita") + .with_size(24) + .with_scale(1) + .next(); + + let firefox = lookup("firefox") + .with_theme("Adwaita") + .with_size(24) + .with_scale(1) + .find(); + + asserting!("Linicon return some icon") + .that(&lin_firefox.unwrap()) + .is_ok() + .map(|icon| &icon.path) + .is_equal_to(PathBuf::from( + "/usr/share/icons/hicolor/22x22/apps/firefox.png", + )); + + asserting!("Our implementation should return the same result as linicon") + .that(&firefox) + .is_some() + .is_equal_to(PathBuf::from( + "/usr/share/icons/hicolor/22x22/apps/firefox.png", + )); + + // pixmaps + let lin_archlinux = linicon::lookup_icon("archlinux-logo") + .from_theme("Adwaita") + .with_size(24) + .with_scale(1) + .next(); + + let archlinux = lookup("archlinux-logo") + .with_theme("Adwaita") + .with_size(24) + .with_scale(1) + .find(); + + asserting!("Linicon fails to fallback to pixmaps") + .that(&lin_archlinux) + .is_none(); + + asserting!("But we succeed") + .that(&archlinux) + .is_some() + .is_equal_to(PathBuf::from("toto")); +}