-
Notifications
You must be signed in to change notification settings - Fork 0
perf: generate perf call-graph flamegraph artifact (#32) #130
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Closed
Closed
Changes from all commits
Commits
Show all changes
13 commits
Select commit
Hold shift + click to select a range
0c3b401
perf: add flamegraph generator and make target (#32)
div0rce beec2d0
perf: add generated flamegraph artifact on bare-metal Fedora Asahi (#32)
div0rce 872600a
perf: harden flamegraph collapsed-stack parsing (Codex review)
div0rce 0201d54
perf: regenerate flamegraph artifact after parser hardening
div0rce 52de5b8
refactor: improve flamegraph.py code health (CodeScene gate)
div0rce d4be2da
perf: regenerate flamegraph artifact after code-health refactor
div0rce 4aec1d0
refactor: flatten flamegraph.py remaining complexity (CodeScene)
div0rce 3905059
perf: regenerate flamegraph artifact after complexity flattening
div0rce 6ef5015
Merge branch 'docs/codex-resume-anchor-sync' into perf/flamegraph-art…
div0rce 31070b1
perf: harden flamegraph.sh classification + sample gating (Codex #130)
div0rce 06b7675
perf: regenerate flamegraph artifact after classification hardening
div0rce 2199820
Merge branch 'docs/codex-resume-anchor-sync' into perf/flamegraph-art…
div0rce 5093beb
docs: embed the flamegraph as a visible image in the README
div0rce File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,59 @@ | ||
| Command: make flamegraph | ||
| Artifact: flamegraph (software cpu-clock sampling hot-symbol profile) | ||
| Hardware: aarch64 | ||
| OS: Linux 6.19.14-400.asahi.fc44.aarch64+16k | ||
| CPU: Avalanche-M2 | ||
| Compiler: c++ (GCC) 16.1.1 20260515 (Red Hat 16.1.1-2) | ||
| Perf: perf version 6.19.14-400.asahi.fc44.aarch64 | ||
| Perf paranoid: 2 | ||
| Build type: Release | ||
| Provenance version: 1 | ||
| Git commit (informational): 31070b1 | ||
| Source digest: sha256:6aa521e6295a99f9dbf7dee9e5bcef04e93174ed12c3e8de9b991a8bfc14c809 | ||
| Source digest scope: flamegraph-benchmark | ||
| Dirty inputs: no | ||
| Generated output: results/flamegraph.svg | ||
| Date: 2026-06-22T02:18:23Z | ||
| Benchmark binary: build/bench/qsl-bench | ||
| Dataset: qsl-bench default synthetic benchmark suite | ||
| Call graph: dwarf | ||
| Record event: cpu-clock | ||
| Sample freq: 4000 Hz | ||
| Sample count (folded total): 329 | ||
| Sample count (perf record est.): 329 | ||
| Folded stacks: 159 | ||
| Minimum samples for hot profile: 200 | ||
| Insufficient samples: no | ||
| Record status: 0 | ||
| Script status: 0 | ||
| Perf access limitation: no | ||
| Flamegraph SVG: results/flamegraph.svg | ||
| Perf data: build/perf/qsl-bench.flame.data (generated, not intended for commit) | ||
|
|
||
| Caveat: this flamegraph is a software cpu-clock sampling profile for hot-symbol | ||
| investigation. Frame width is proportional to on-CPU samples, not wall-clock | ||
| latency or throughput, and is hardware/kernel/compiler/build dependent. | ||
|
|
||
| Top 15 folded stacks (count stack): | ||
| 15 qsl-bench;[unknown];[unknown];[unknown];__libc_start_call_main;main;qsl::protocol::decode_new_order(std::span<std::byte const, 18446744073709551615ul>) | ||
| 11 qsl-bench;[unknown];[unknown];[unknown];__libc_start_call_main;main;qsl::gateway::Session::on_bytes(std::span<std::byte const, 18446744073709551615ul>);qsl::gateway::Session::on_bytes(std::span<std::byte const, 18446744073709551615ul>, std::vector<std::byte, std::allocator<std::byte> >&, unsigned long);qsl::gateway::Session::process_frame(std::span<std::byte const, 18446744073709551615ul>, std::vector<std::byte, std::allocator<std::byte> >&, unsigned long);qsl::gateway::OrderGateway::new_limit(unsigned int, unsigned long, qsl::core::Side, long, unsigned int, qsl::core::TimeInForce);qsl::engine::MatchingEngine::new_limit(unsigned int, unsigned long, qsl::core::Side, long, unsigned int, qsl::core::TimeInForce) | ||
| 11 qsl-bench;[unknown];[unknown];[unknown];__libc_start_call_main;main;qsl::replay::generate_flow(unsigned long, unsigned int, unsigned long);qsl::engine::MatchingEngine::contains(unsigned int, unsigned long) const | ||
| 8 qsl-bench;__libc_start_call_main;[unknown];[unknown];cfree@GLIBC_2.17 | ||
| 7 qsl-bench;[unknown];[unknown];[unknown];__libc_start_call_main;main;qsl::engine::OrderBook::cancel(unsigned long);decltype(auto) qsl::engine::OrderBook::dispatch_storage<qsl::engine::OrderBook::cancel(unsigned long)::{lambda()#1}, qsl::engine::OrderBook::cancel(unsigned long)::{lambda(qsl::engine::OrderBook::IntrusiveStore&)#1}, qsl::engine::OrderBook::cancel(unsigned long)::{lambda(qsl::engine::OrderBook::ContiguousStore&)#1}>(qsl::engine::OrderBook::cancel(unsigned long)::{lambda()#1}&&, qsl::engine::OrderBook::cancel(unsigned long)::{lambda(qsl::engine::OrderBook::IntrusiveStore&)#1}&&, qsl::engine::OrderBook::cancel(unsigned long)::{lambda(qsl::engine::OrderBook::ContiguousStore&)#1}&&) [clone .isra.0];qsl::engine::OrderBook::erase_resting_order(qsl::engine::OrderBook::Locator const&) | ||
| 6 qsl-bench;[unknown];[unknown];[unknown];__libc_start_call_main;main;qsl::gateway::Session::on_bytes(std::span<std::byte const, 18446744073709551615ul>);qsl::gateway::Session::on_bytes(std::span<std::byte const, 18446744073709551615ul>, std::vector<std::byte, std::allocator<std::byte> >&, unsigned long);qsl::gateway::Session::process_frame(std::span<std::byte const, 18446744073709551615ul>, std::vector<std::byte, std::allocator<std::byte> >&, unsigned long);qsl::gateway::OrderGateway::new_limit(unsigned int, unsigned long, qsl::core::Side, long, unsigned int, qsl::core::TimeInForce) | ||
| 6 qsl-bench;[unknown];[unknown];[unknown];__libc_start_call_main;main;qsl::replay::apply(qsl::engine::MatchingEngine&, std::variant<qsl::replay::RegisterSymbol, qsl::replay::NewLimit, qsl::replay::NewMarket, qsl::replay::Cancel, qsl::replay::Modify> const&);qsl::engine::MatchingEngine::new_limit(unsigned int, unsigned long, qsl::core::Side, long, unsigned int, qsl::core::TimeInForce) | ||
| 5 qsl-bench;qsl::engine::OrderBook::erase_resting_order(qsl::engine::OrderBook::Locator const&);operator delete(void*, std::align_val_t)@plt | ||
| 5 qsl-bench;qsl::engine::OrderBook::erase_resting_order(qsl::engine::OrderBook::Locator const&);operator delete(void*, unsigned long, std::align_val_t)@plt | ||
| 5 qsl-bench;std::_Hashtable<unsigned long, std::pair<unsigned long const, qsl::engine::OrderBook::Locator>, std::pmr::polymorphic_allocator<std::pair<unsigned long const, qsl::engine::OrderBook::Locator> >, std::__detail::_Select1st, std::equal_to<unsigned long>, std::hash<unsigned long>, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Prime_rehash_policy, std::__detail::_Hashtable_traits<false, false, true> >::_M_erase(unsigned long, std::__detail::_Hash_node_base*, std::__detail::_Hash_node<std::pair<unsigned long const, qsl::engine::OrderBook::Locator>, false>*);operator delete(void*, unsigned long, std::align_val_t)@plt | ||
| 5 qsl-bench;[unknown];[unknown];operator new(unsigned long);malloc@plt | ||
| 5 qsl-bench;[unknown];[unknown];[unknown];__libc_start_call_main;main;qsl::replay::generate_flow(unsigned long, unsigned int, unsigned long);qsl::engine::OrderBook::contains(unsigned long) const | ||
| 4 qsl-bench;decltype(auto) qsl::engine::OrderBook::dispatch_storage<qsl::engine::OrderBook::cancel(unsigned long)::{lambda()#1}, qsl::engine::OrderBook::cancel(unsigned long)::{lambda(qsl::engine::OrderBook::IntrusiveStore&)#1}, qsl::engine::OrderBook::cancel(unsigned long)::{lambda(qsl::engine::OrderBook::ContiguousStore&)#1}>(qsl::engine::OrderBook::cancel(unsigned long)::{lambda()#1}&&, qsl::engine::OrderBook::cancel(unsigned long)::{lambda(qsl::engine::OrderBook::IntrusiveStore&)#1}&&, qsl::engine::OrderBook::cancel(unsigned long)::{lambda(qsl::engine::OrderBook::ContiguousStore&)#1}&&) [clone .isra.0];[unknown];[unknown];cfree@GLIBC_2.17 | ||
| 4 qsl-bench;main;[unknown];[unknown];operator new(unsigned long);malloc | ||
| 4 qsl-bench;operator new(unsigned long);malloc@plt | ||
|
|
||
| Benchmark output: | ||
| order_book add/mod/cancel 200000 ops 132.8 ns/op 7531861 ops/sec | ||
| protocol encode+decode 500000 ops 20.5 ns/op 48773893 ops/sec | ||
| gateway session (fill) 200000 ops 127.4 ns/op 7848348 ops/sec | ||
| matching engine flow 5004 items 101.6 ns/item 9840697 items/sec | ||
| replay command log 5004 items 112.0 ns/item 8928265 items/sec |
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This new entry records issue #32 as done and adds a 242nd check plus a new flamegraph artifact, but the current-state resume anchors still list #32 as open legacy backlog and report the old 241-test / 15-result state. Because
/resumereads those top-level anchors before the history log, the next agent can restart the just-finished flamegraph work or report stale verification; update PROGRESS/HANDOFF current state alongside this completion entry.Useful? React with 👍 / 👎.