switch to profiling crates

This switches to the profiling crate for compatible
profiling between rust libraries.

To enable:

$ cargo build --release --features puffin

Feel free to experiment with other profiling backends
as well! Would be great to get tracy working.
This commit is contained in:
William Casarin
2025-03-23 10:43:49 -07:00
parent 7b9e6f180c
commit 54deb2dd88
20 changed files with 46 additions and 80 deletions

6
.envrc
View File

@@ -13,6 +13,6 @@ source scripts/macos_build_secrets.sh || :
export PATH=$PATH:$HOME/.cargo/bin export PATH=$PATH:$HOME/.cargo/bin
export JB55=32e1827635450ebb3c5a7d12c1f8e7b2b514439ac10a67eef3d9fd9c5c68e245 export JB55=32e1827635450ebb3c5a7d12c1f8e7b2b514439ac10a67eef3d9fd9c5c68e245
export JACK=npub1sg6plzptd64u62a878hep2kev88swjh3tw00gjsfl8f237lmu63q0uf63m # simple todo reminders
export VROD=bd1e19980e2c91e6dc657e92c25762ca882eb9272d2579e221f037f93788de91 export TODO_FILE=TODO
export JEFFG=npub1zuuajd7u3sx8xu92yav9jwxpr839cs0kc3q6t56vd5u9q033xmhsk6c2uc 2>/dev/null todo.sh ls || :

1
.gitignore vendored
View File

@@ -1,4 +1,5 @@
.buildcmd .buildcmd
TODO.bak
android-config.json android-config.json
build.log build.log
perf.data perf.data

4
Cargo.lock generated
View File

@@ -2740,6 +2740,7 @@ dependencies = [
"nostr", "nostr",
"nostrdb", "nostrdb",
"poll-promise", "poll-promise",
"profiling",
"puffin", "puffin",
"puffin_egui", "puffin_egui",
"serde", "serde",
@@ -2765,6 +2766,7 @@ dependencies = [
"egui_extras", "egui_extras",
"notedeck", "notedeck",
"notedeck_columns", "notedeck_columns",
"profiling",
"puffin", "puffin",
"puffin_egui", "puffin_egui",
"serde", "serde",
@@ -2803,6 +2805,7 @@ dependencies = [
"open", "open",
"poll-promise", "poll-promise",
"pretty_assertions", "pretty_assertions",
"profiling",
"puffin", "puffin",
"puffin_egui", "puffin_egui",
"rfd", "rfd",
@@ -3487,6 +3490,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "afbdc74edc00b6f6a218ca6a5364d6226a259d4b8ea1af4a0ea063f27e179f4d" checksum = "afbdc74edc00b6f6a218ca6a5364d6226a259d4b8ea1af4a0ea063f27e179f4d"
dependencies = [ dependencies = [
"profiling-procmacros", "profiling-procmacros",
"puffin",
] ]
[[package]] [[package]]

View File

@@ -62,6 +62,7 @@ bincode = "1.3.3"
mime_guess = "2.0.5" mime_guess = "2.0.5"
pretty_assertions = "1.4.1" pretty_assertions = "1.4.1"
jni = "0.21.1" jni = "0.21.1"
profiling = "1.0"
[profile.small] [profile.small]
inherits = 'release' inherits = 'release'
@@ -84,6 +85,8 @@ eframe = { git = "https://github.com/damus-io/egui", rev = "93cd1cedc1e8eed2b055
egui-winit = { git = "https://github.com/damus-io/egui", rev = "93cd1cedc1e8eed2b055e317226838e37a845aad" } egui-winit = { git = "https://github.com/damus-io/egui", rev = "93cd1cedc1e8eed2b055e317226838e37a845aad" }
egui_extras = { git = "https://github.com/damus-io/egui", rev = "93cd1cedc1e8eed2b055e317226838e37a845aad" } egui_extras = { git = "https://github.com/damus-io/egui", rev = "93cd1cedc1e8eed2b055e317226838e37a845aad" }
epaint = { git = "https://github.com/damus-io/egui", rev = "93cd1cedc1e8eed2b055e317226838e37a845aad" } epaint = { git = "https://github.com/damus-io/egui", rev = "93cd1cedc1e8eed2b055e317226838e37a845aad" }
puffin = { git = "https://github.com/jb55/puffin", package = "puffin", rev = "c6a6242adaf90b6292c0f462d2acd34d96d224d2" }
puffin_egui = { git = "https://github.com/jb55/puffin", package = "puffin_egui", rev = "c6a6242adaf90b6292c0f462d2acd34d96d224d2" }
#winit = { git = "https://github.com/damus-io/winit", rev = "14d61a74bee0c9863abe7ef28efae2c4d8bd3743" } #winit = { git = "https://github.com/damus-io/winit", rev = "14d61a74bee0c9863abe7ef28efae2c4d8bd3743" }
#winit = { path = "/home/jb55/dev/github/rust-windowing/winit" } #winit = { path = "/home/jb55/dev/github/rust-windowing/winit" }
#android-activity = { git = "https://github.com/damus-io/android-activity", rev = "da17773852312a58c3445422dfe477162f2f1265" } #android-activity = { git = "https://github.com/damus-io/android-activity", rev = "da17773852312a58c3445422dfe477162f2f1265" }

0
TODO Normal file
View File

View File

@@ -32,6 +32,7 @@ ehttp = {workspace = true }
mime_guess = { workspace = true } mime_guess = { workspace = true }
egui-winit = { workspace = true } egui-winit = { workspace = true }
tokenator = { workspace = true } tokenator = { workspace = true }
profiling = { workspace = true }
[dev-dependencies] [dev-dependencies]
tempfile = { workspace = true } tempfile = { workspace = true }
@@ -40,4 +41,4 @@ tempfile = { workspace = true }
jni = { workspace = true } jni = { workspace = true }
[features] [features]
profiling = ["puffin", "puffin_egui"] puffin = ["puffin_egui", "dep:puffin"]

View File

@@ -76,8 +76,7 @@ fn render_notedeck(notedeck: &mut Notedeck, ctx: &egui::Context) {
impl eframe::App for Notedeck { impl eframe::App for Notedeck {
fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) { fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) {
#[cfg(feature = "profiling")] profiling::finish_frame!();
puffin::GlobalProfiler::lock().new_frame();
// handle account updates // handle account updates
self.accounts.update(&mut self.ndb, &mut self.pool, ctx); self.accounts.update(&mut self.ndb, &mut self.pool, ctx);
@@ -97,7 +96,7 @@ impl eframe::App for Notedeck {
} }
} }
#[cfg(feature = "profiling")] #[cfg(feature = "puffin")]
puffin_egui::profiler_window(ctx); puffin_egui::profiler_window(ctx);
} }
@@ -107,15 +106,16 @@ impl eframe::App for Notedeck {
} }
} }
#[cfg(feature = "profiling")] #[cfg(feature = "puffin")]
fn setup_profiling() { fn setup_puffin() {
info!("setting up puffin");
puffin::set_scopes_on(true); // tell puffin to collect data puffin::set_scopes_on(true); // tell puffin to collect data
} }
impl Notedeck { impl Notedeck {
pub fn new<P: AsRef<Path>>(ctx: &egui::Context, data_path: P, args: &[String]) -> Self { pub fn new<P: AsRef<Path>>(ctx: &egui::Context, data_path: P, args: &[String]) -> Self {
#[cfg(feature = "profiling")] #[cfg(feature = "puffin")]
setup_profiling(); setup_puffin();
// Skip the first argument, which is the program name. // Skip the first argument, which is the program name.
let (parsed_args, unrecognized_args) = Args::parse(&args[1..]); let (parsed_args, unrecognized_args) = Args::parse(&args[1..]);

View File

@@ -246,6 +246,7 @@ impl UnknownId {
/// We return all of this in a HashSet so that we can fetch these from /// We return all of this in a HashSet so that we can fetch these from
/// remote relays. /// remote relays.
/// ///
#[profiling::function]
pub fn get_unknown_note_ids<'a>( pub fn get_unknown_note_ids<'a>(
ndb: &Ndb, ndb: &Ndb,
cached_note: &CachedNote, cached_note: &CachedNote,
@@ -253,9 +254,6 @@ pub fn get_unknown_note_ids<'a>(
note: &Note<'a>, note: &Note<'a>,
ids: &mut HashMap<UnknownId, HashSet<RelayUrl>>, ids: &mut HashMap<UnknownId, HashSet<RelayUrl>>,
) -> Result<()> { ) -> Result<()> {
#[cfg(feature = "profiling")]
puffin::profile_function!();
// the author pubkey // the author pubkey
if ndb.get_profile_by_pubkey(txn, note.pubkey()).is_err() { if ndb.get_profile_by_pubkey(txn, note.pubkey()).is_err() {
ids.entry(UnknownId::Pubkey(Pubkey::new(*note.pubkey()))) ids.entry(UnknownId::Pubkey(Pubkey::new(*note.pubkey())))

View File

@@ -23,6 +23,7 @@ tokio = { workspace = true }
tracing-appender = { workspace = true } tracing-appender = { workspace = true }
tracing-subscriber = { workspace = true } tracing-subscriber = { workspace = true }
tracing = { workspace = true } tracing = { workspace = true }
profiling = { workspace = true }
[dev-dependencies] [dev-dependencies]
tempfile = { workspace = true } tempfile = { workspace = true }
@@ -40,7 +41,7 @@ path = "src/preview.rs"
[features] [features]
default = [] default = []
profiling = ["notedeck_columns/puffin", "puffin", "puffin_egui"] puffin = ["profiling/profile-with-puffin", "dep:puffin"]
debug-widget-callstack = ["egui/callstack"] debug-widget-callstack = ["egui/callstack"]
debug-interactive-widgets = [] debug-interactive-widgets = []

View File

@@ -49,6 +49,7 @@ uuid = { workspace = true }
sha2 = { workspace = true } sha2 = { workspace = true }
base64 = { workspace = true } base64 = { workspace = true }
egui-winit = { workspace = true } egui-winit = { workspace = true }
profiling = { workspace = true }
[target.'cfg(any(target_os = "windows", target_os = "macos", target_os = "linux"))'.dependencies] [target.'cfg(any(target_os = "windows", target_os = "macos", target_os = "linux"))'.dependencies]
rfd = "0.15" rfd = "0.15"
@@ -62,5 +63,5 @@ security-framework = "2.11.0"
[features] [features]
default = [] default = []
profiling = ["puffin", "puffin_egui"] puffin = ["dep:puffin", "profiling/profile-with-puffin"]

View File

@@ -507,10 +507,8 @@ fn circle_icon(ui: &mut egui::Ui, openness: f32, response: &egui::Response) {
} }
*/ */
#[profiling::function]
fn render_damus_mobile(app: &mut Damus, app_ctx: &mut AppContext<'_>, ui: &mut egui::Ui) { fn render_damus_mobile(app: &mut Damus, app_ctx: &mut AppContext<'_>, ui: &mut egui::Ui) {
#[cfg(feature = "profiling")]
puffin::profile_function!();
//let routes = app.timelines[0].routes.clone(); //let routes = app.timelines[0].routes.clone();
if !app.columns(app_ctx.accounts).columns().is_empty() if !app.columns(app_ctx.accounts).columns().is_empty()
@@ -522,10 +520,8 @@ fn render_damus_mobile(app: &mut Damus, app_ctx: &mut AppContext<'_>, ui: &mut e
} }
} }
#[profiling::function]
fn render_damus_desktop(app: &mut Damus, app_ctx: &mut AppContext<'_>, ui: &mut egui::Ui) { fn render_damus_desktop(app: &mut Damus, app_ctx: &mut AppContext<'_>, ui: &mut egui::Ui) {
#[cfg(feature = "profiling")]
puffin::profile_function!();
let screen_size = ui.ctx().screen_rect().width(); let screen_size = ui.ctx().screen_rect().width();
let calc_panel_width = (screen_size let calc_panel_width = (screen_size
/ get_active_columns(app_ctx.accounts, &app.decks_cache).num_columns() as f32) / get_active_columns(app_ctx.accounts, &app.decks_cache).num_columns() as f32)

View File

@@ -67,10 +67,8 @@ pub fn aspect_fill(
response response
} }
#[profiling::function]
pub fn round_image(image: &mut ColorImage) { pub fn round_image(image: &mut ColorImage) {
#[cfg(feature = "profiling")]
puffin::profile_function!();
// The radius to the edge of of the avatar circle // The radius to the edge of of the avatar circle
let edge_radius = image.size[0] as f32 / 2.0; let edge_radius = image.size[0] as f32 / 2.0;
let edge_radius_squared = edge_radius * edge_radius; let edge_radius_squared = edge_radius * edge_radius;
@@ -114,10 +112,8 @@ pub fn round_image(image: &mut ColorImage) {
} }
} }
#[profiling::function]
fn process_pfp_bitmap(imgtyp: ImageType, mut image: image::DynamicImage) -> ColorImage { fn process_pfp_bitmap(imgtyp: ImageType, mut image: image::DynamicImage) -> ColorImage {
#[cfg(feature = "profiling")]
puffin::profile_function!();
match imgtyp { match imgtyp {
ImageType::Content => { ImageType::Content => {
let image_buffer = image.clone().into_rgba8(); let image_buffer = image.clone().into_rgba8();
@@ -156,10 +152,8 @@ fn process_pfp_bitmap(imgtyp: ImageType, mut image: image::DynamicImage) -> Colo
} }
} }
#[profiling::function]
fn parse_img_response(response: ehttp::Response, imgtyp: ImageType) -> Result<ColorImage> { fn parse_img_response(response: ehttp::Response, imgtyp: ImageType) -> Result<ColorImage> {
#[cfg(feature = "profiling")]
puffin::profile_function!();
let content_type = response.content_type().unwrap_or_default(); let content_type = response.content_type().unwrap_or_default();
let size_hint = match imgtyp { let size_hint = match imgtyp {
ImageType::Profile(size) => SizeHint::Size(size, size), ImageType::Profile(size) => SizeHint::Size(size, size),
@@ -167,16 +161,14 @@ fn parse_img_response(response: ehttp::Response, imgtyp: ImageType) -> Result<Co
}; };
if content_type.starts_with("image/svg") { if content_type.starts_with("image/svg") {
#[cfg(feature = "profiling")] profiling::scope!("load_svg");
puffin::profile_scope!("load_svg");
let mut color_image = let mut color_image =
egui_extras::image::load_svg_bytes_with_size(&response.bytes, Some(size_hint))?; egui_extras::image::load_svg_bytes_with_size(&response.bytes, Some(size_hint))?;
round_image(&mut color_image); round_image(&mut color_image);
Ok(color_image) Ok(color_image)
} else if content_type.starts_with("image/") { } else if content_type.starts_with("image/") {
#[cfg(feature = "profiling")] profiling::scope!("load_from_memory");
puffin::profile_scope!("load_from_memory");
let dyn_image = image::load_from_memory(&response.bytes)?; let dyn_image = image::load_from_memory(&response.bytes)?;
Ok(process_pfp_bitmap(imgtyp, dyn_image)) Ok(process_pfp_bitmap(imgtyp, dyn_image))
} else { } else {

View File

@@ -63,6 +63,7 @@ impl egui::Widget for Mention<'_> {
} }
#[allow(clippy::too_many_arguments)] #[allow(clippy::too_many_arguments)]
#[profiling::function]
fn mention_ui( fn mention_ui(
ndb: &Ndb, ndb: &Ndb,
img_cache: &mut Images, img_cache: &mut Images,
@@ -72,9 +73,6 @@ fn mention_ui(
size: f32, size: f32,
selectable: bool, selectable: bool,
) -> egui::InnerResponse<Option<NoteAction>> { ) -> egui::InnerResponse<Option<NoteAction>> {
#[cfg(feature = "profiling")]
puffin::profile_function!();
let link_color = ui.visuals().hyperlink_color; let link_color = ui.visuals().hyperlink_color;
ui.horizontal(|ui| { ui.horizontal(|ui| {

View File

@@ -60,6 +60,7 @@ impl egui::Widget for &mut NoteContents<'_, '_> {
/// Render an inline note preview with a border. These are used when /// Render an inline note preview with a border. These are used when
/// notes are references within a note /// notes are references within a note
#[allow(clippy::too_many_arguments)] #[allow(clippy::too_many_arguments)]
#[profiling::function]
pub fn render_note_preview( pub fn render_note_preview(
ui: &mut egui::Ui, ui: &mut egui::Ui,
note_context: &mut NoteContext, note_context: &mut NoteContext,
@@ -68,9 +69,6 @@ pub fn render_note_preview(
parent: NoteKey, parent: NoteKey,
note_options: NoteOptions, note_options: NoteOptions,
) -> NoteResponse { ) -> NoteResponse {
#[cfg(feature = "profiling")]
puffin::profile_function!();
let note = if let Ok(note) = note_context.ndb.get_note_by_id(txn, id) { let note = if let Ok(note) = note_context.ndb.get_note_by_id(txn, id) {
// TODO: support other preview kinds // TODO: support other preview kinds
if note.kind() == 1 { if note.kind() == 1 {
@@ -118,6 +116,7 @@ pub fn render_note_preview(
} }
#[allow(clippy::too_many_arguments)] #[allow(clippy::too_many_arguments)]
#[profiling::function]
fn render_note_contents( fn render_note_contents(
ui: &mut egui::Ui, ui: &mut egui::Ui,
note_context: &mut NoteContext, note_context: &mut NoteContext,
@@ -125,9 +124,6 @@ fn render_note_contents(
note: &Note, note: &Note,
options: NoteOptions, options: NoteOptions,
) -> NoteResponse { ) -> NoteResponse {
#[cfg(feature = "profiling")]
puffin::profile_function!();
let note_key = note.key().expect("todo: implement non-db notes"); let note_key = note.key().expect("todo: implement non-db notes");
let selectable = options.has_selectable_text(); let selectable = options.has_selectable_text();
let mut images: Vec<(String, MediaCacheType)> = vec![]; let mut images: Vec<(String, MediaCacheType)> = vec![];
@@ -197,8 +193,6 @@ fn render_note_contents(
}, },
BlockType::Hashtag => { BlockType::Hashtag => {
#[cfg(feature = "profiling")]
puffin::profile_scope!("hashtag contents");
let resp = ui.colored_label(link_color, format!("#{}", block.as_str())); let resp = ui.colored_label(link_color, format!("#{}", block.as_str()));
if resp.clicked() { if resp.clicked() {
@@ -223,8 +217,6 @@ fn render_note_contents(
} }
}; };
if hide_media || !found_supported() { if hide_media || !found_supported() {
#[cfg(feature = "profiling")]
puffin::profile_scope!("url contents");
ui.add(Hyperlink::from_label_and_url( ui.add(Hyperlink::from_label_and_url(
RichText::new(block.as_str()).color(link_color), RichText::new(block.as_str()).color(link_color),
block.as_str(), block.as_str(),
@@ -233,8 +225,6 @@ fn render_note_contents(
} }
BlockType::Text => { BlockType::Text => {
#[cfg(feature = "profiling")]
puffin::profile_scope!("text contents");
if options.has_scramble_text() { if options.has_scramble_text() {
ui.add(egui::Label::new(rot13(block.as_str())).selectable(selectable)); ui.add(egui::Label::new(rot13(block.as_str())).selectable(selectable));
} else { } else {

View File

@@ -97,10 +97,8 @@ impl NoteContextButton {
Self::max_distance_between_circles() / Self::expansion_multiple() Self::max_distance_between_circles() / Self::expansion_multiple()
} }
#[profiling::function]
pub fn show(ui: &mut egui::Ui, note_key: NoteKey, put_at: Rect) -> egui::Response { pub fn show(ui: &mut egui::Ui, note_key: NoteKey, put_at: Rect) -> egui::Response {
#[cfg(feature = "profiling")]
puffin::profile_function!();
let id = ui.id().with(("more_options_anim", note_key)); let id = ui.id().with(("more_options_anim", note_key));
let min_radius = Self::min_radius(); let min_radius = Self::min_radius();
@@ -138,13 +136,11 @@ impl NoteContextButton {
response response
} }
#[profiling::function]
pub fn menu( pub fn menu(
ui: &mut egui::Ui, ui: &mut egui::Ui,
button_response: egui::Response, button_response: egui::Response,
) -> Option<NoteContextSelection> { ) -> Option<NoteContextSelection> {
#[cfg(feature = "profiling")]
puffin::profile_function!();
let mut context_selection: Option<NoteContextSelection> = None; let mut context_selection: Option<NoteContextSelection> = None;
stationary_arbitrary_menu_button(ui, button_response, |ui| { stationary_arbitrary_menu_button(ui, button_response, |ui| {

View File

@@ -307,15 +307,13 @@ impl<'a, 'd> NoteView<'a, 'd> {
} }
} }
#[profiling::function]
fn note_header( fn note_header(
ui: &mut egui::Ui, ui: &mut egui::Ui,
note_cache: &mut NoteCache, note_cache: &mut NoteCache,
note: &Note, note: &Note,
profile: &Result<nostrdb::ProfileRecord<'_>, nostrdb::Error>, profile: &Result<nostrdb::ProfileRecord<'_>, nostrdb::Error>,
) { ) {
#[cfg(feature = "profiling")]
puffin::profile_function!();
let note_key = note.key().unwrap(); let note_key = note.key().unwrap();
ui.horizontal(|ui| { ui.horizontal(|ui| {
@@ -327,9 +325,8 @@ impl<'a, 'd> NoteView<'a, 'd> {
}); });
} }
#[profiling::function]
fn show_standard(&mut self, ui: &mut egui::Ui) -> NoteResponse { fn show_standard(&mut self, ui: &mut egui::Ui) -> NoteResponse {
#[cfg(feature = "profiling")]
puffin::profile_function!();
let note_key = self.note.key().expect("todo: support non-db notes"); let note_key = self.note.key().expect("todo: support non-db notes");
let txn = self.note.txn().expect("todo: support non-db notes"); let txn = self.note.txn().expect("todo: support non-db notes");
@@ -563,14 +560,12 @@ fn note_hitbox_clicked(
} }
} }
#[profiling::function]
fn render_note_actionbar( fn render_note_actionbar(
ui: &mut egui::Ui, ui: &mut egui::Ui,
note_id: &[u8; 32], note_id: &[u8; 32],
note_key: NoteKey, note_key: NoteKey,
) -> egui::InnerResponse<Option<NoteAction>> { ) -> egui::InnerResponse<Option<NoteAction>> {
#[cfg(feature = "profiling")]
puffin::profile_function!();
ui.horizontal(|ui| { ui.horizontal(|ui| {
let reply_resp = reply_button(ui, note_key); let reply_resp = reply_button(ui, note_key);
let quote_resp = quote_repost_button(ui, note_key); let quote_resp = quote_repost_button(ui, note_key);
@@ -590,14 +585,12 @@ fn secondary_label(ui: &mut egui::Ui, s: impl Into<String>) {
ui.add(Label::new(RichText::new(s).size(10.0).color(color))); ui.add(Label::new(RichText::new(s).size(10.0).color(color)));
} }
#[profiling::function]
fn render_reltime( fn render_reltime(
ui: &mut egui::Ui, ui: &mut egui::Ui,
note_cache: &mut CachedNote, note_cache: &mut CachedNote,
before: bool, before: bool,
) -> egui::InnerResponse<()> { ) -> egui::InnerResponse<()> {
#[cfg(feature = "profiling")]
puffin::profile_function!();
ui.horizontal(|ui| { ui.horizontal(|ui| {
if before { if before {
secondary_label(ui, ""); secondary_label(ui, "");

View File

@@ -8,6 +8,7 @@ use nostrdb::{Note, NoteReply, Transaction};
use super::{contents::NoteContext, NoteOptions}; use super::{contents::NoteContext, NoteOptions};
#[must_use = "Please handle the resulting note action"] #[must_use = "Please handle the resulting note action"]
#[profiling::function]
pub fn reply_desc( pub fn reply_desc(
ui: &mut egui::Ui, ui: &mut egui::Ui,
txn: &Transaction, txn: &Transaction,
@@ -15,9 +16,6 @@ pub fn reply_desc(
note_context: &mut NoteContext, note_context: &mut NoteContext,
note_options: NoteOptions, note_options: NoteOptions,
) -> Option<NoteAction> { ) -> Option<NoteAction> {
#[cfg(feature = "profiling")]
puffin::profile_function!();
let mut note_action: Option<NoteAction> = None; let mut note_action: Option<NoteAction> = None;
let size = 10.0; let size = 10.0;
let selectable = false; let selectable = false;

View File

@@ -80,6 +80,7 @@ impl<'cache, 'url> ProfilePic<'cache, 'url> {
} }
} }
#[profiling::function]
fn render_pfp( fn render_pfp(
ui: &mut egui::Ui, ui: &mut egui::Ui,
img_cache: &mut Images, img_cache: &mut Images,
@@ -87,9 +88,6 @@ fn render_pfp(
ui_size: f32, ui_size: f32,
border: Option<Stroke>, border: Option<Stroke>,
) -> egui::Response { ) -> egui::Response {
#[cfg(feature = "profiling")]
puffin::profile_function!();
// We will want to downsample these so it's not blurry on hi res displays // We will want to downsample these so it's not blurry on hi res displays
let img_size = 128u32; let img_size = 128u32;
@@ -116,15 +114,13 @@ fn render_pfp(
) )
} }
#[profiling::function]
fn pfp_image( fn pfp_image(
ui: &mut egui::Ui, ui: &mut egui::Ui,
img: &TextureHandle, img: &TextureHandle,
size: f32, size: f32,
border: Option<Stroke>, border: Option<Stroke>,
) -> egui::Response { ) -> egui::Response {
#[cfg(feature = "profiling")]
puffin::profile_function!();
let (rect, response) = ui.allocate_at_least(vec2(size, size), Sense::hover()); let (rect, response) = ui.allocate_at_least(vec2(size, size), Sense::hover());
if let Some(stroke) = border { if let Some(stroke) = border {
draw_bg_border(ui, rect.center(), size, stroke); draw_bg_border(ui, rect.center(), size, stroke);

View File

@@ -25,6 +25,7 @@ pub fn update_from_columns(
} }
} }
#[profiling::function]
pub fn get_unknown_ids( pub fn get_unknown_ids(
txn: &Transaction, txn: &Transaction,
unknown_ids: &mut UnknownIds, unknown_ids: &mut UnknownIds,
@@ -32,9 +33,6 @@ pub fn get_unknown_ids(
ndb: &Ndb, ndb: &Ndb,
note_cache: &mut NoteCache, note_cache: &mut NoteCache,
) -> Result<()> { ) -> Result<()> {
#[cfg(feature = "profiling")]
puffin::profile_function!();
let mut new_cached_notes: Vec<(NoteKey, CachedNote)> = vec![]; let mut new_cached_notes: Vec<(NoteKey, CachedNote)> = vec![];
for (_kind, timeline) in timeline_cache.timelines.iter() { for (_kind, timeline) in timeline_cache.timelines.iter() {

View File

@@ -1,5 +1,5 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# pass --mobile for mobile previews # pass --mobile for mobile previews
#RUST_LOG=info cargo run --bin ui_preview --features profiling --release -- "$@" #RUST_LOG=info cargo run --bin ui_preview --features puffin --release -- "$@"
cargo run --bin ui_preview --release -- "$@" cargo run --bin ui_preview --release -- "$@"