From 8bccb11924e29d2201041c4dc818909d93d78b1d Mon Sep 17 00:00:00 2001 From: Julien Portalier Date: Fri, 6 Mar 2026 14:07:32 +0100 Subject: [PATCH] Improve performance of FiberTrace.pretty_log_fibers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Johannes Müller --- src/perf_tools/fiber_trace.cr | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/src/perf_tools/fiber_trace.cr b/src/perf_tools/fiber_trace.cr index 5584c8d..9465086 100644 --- a/src/perf_tools/fiber_trace.cr +++ b/src/perf_tools/fiber_trace.cr @@ -130,15 +130,13 @@ module PerfTools::FiberTrace # | 1 | ` Signal Loop ` | ` /opt/homebrew/Cellar/crystal/1.9.2/share/crystal/src/crystal/system/unix/signal.cr:60:5 in 'start_loop' `
` /opt/homebrew/Cellar/crystal/1.9.2/share/crystal/src/crystal/system/unix/signal.cr:163:5 in 'setup_default_handlers' `
` /opt/homebrew/Cellar/crystal/1.9.2/share/crystal/src/kernel.cr:558:1 in '__crystal_main' `
` /opt/homebrew/Cellar/crystal/1.9.2/share/crystal/src/crystal/main.cr:129:5 in 'main_user_code' `
` /opt/homebrew/Cellar/crystal/1.9.2/share/crystal/src/crystal/main.cr:115:7 in 'main' ` | ` /opt/homebrew/Cellar/crystal/1.9.2/share/crystal/src/crystal/scheduler.cr:50:5 in 'reschedule' `
` /opt/homebrew/Cellar/crystal/1.9.2/share/crystal/src/io/evented.cr:128:5 in 'wait_readable' `
` /opt/homebrew/Cellar/crystal/1.9.2/share/crystal/src/io/evented.cr:119:3 in 'wait_readable' `
` /opt/homebrew/Cellar/crystal/1.9.2/share/crystal/src/io/evented.cr:59:9 in 'unbuffered_read' `
` /opt/homebrew/Cellar/crystal/1.9.2/share/crystal/src/io/buffered.cr:261:5 in 'fill_buffer' ` | # ``` def self.pretty_log_fibers(io : IO) : Nil - fibers = [] of Fiber - Fiber.each { |fiber| fibers << fiber } - - uniqs = fibers - .map { |fiber| {fiber.name, fiber.__spawn_stack, fiber.__yield_stack} } - .group_by { |_, s, y| {s, y} } - .transform_values(&.map { |fiber, _, _| fiber }) - .to_a - .sort_by! { |(s, y), names| {-names.size, s, y} } + fibers = Hash({Slice(Void*), Slice(Void*)}, Array(String)).new do |hash, key| + hash[key] = [] of String + end + Fiber.each do |fiber| + fibers[{fiber.__spawn_stack, fiber.__yield_stack}] << fiber.name.to_s + end + uniqs = fibers.to_a.sort_by! { |(s, y), names| {-names.size, s, y} } io.puts "| Count | Fibers | Spawn stack | Yield stack |" io.puts "|------:|:-------|:------------|:------------|"