#低开销 #跟踪 #循环缓冲区

bin+lib tsc-trace

使用时间戳计数器 (x86 rdtsc) 对 Rust 代码进行低开销跟踪

4 个版本 (破坏性)

0.7.0 2024年7月18日
0.6.0 2023年9月10日
0.5.0 2023年9月6日
0.4.0 2023年9月4日

#270 in 调试

Download history 109/week @ 2024-07-17 11/week @ 2024-07-24 6/week @ 2024-07-31

每月下载量 126

MIT 许可证

14KB
221 代码行

tsc-trace

Crates.io

通过 x86 rdtsc 指令或读取 ARM cntvct_el0 寄存器,跟踪代码跨度使用的循环次数。除非你将线程固定在核心上,否则可能会给出可疑的结果。

请参阅 main.rs 以获取示例用法。

特性 "capacity_1_million" ... "capacity_64_million" 设置线程局部 vec 存储跟踪使用的容量(以跟踪数计,不是字节)。默认为 100 万。这个 vec 被视为循环缓冲区,所以它会回绕并覆盖跟踪,而不是重新分配、OOM 或停止收集。每个跟踪使用 24 字节(u64 标签、u64 开始计数、u64 结束计数)。因此,总内存开销为

(1 usize 作为索引 + (容量 * 24 字节)) * 线程数。

或者,你可以使用特性 "off" 将容量设置为 0 并静态禁用跟踪收集。如果你想在未来使用定时标记,但又不想承担任何运行时开销,这将非常有用。

特性 "const_array" 将使用 const 数组而不是 vec 来存储线程局部跟踪。

特性 "lfence" 将在每个 rdtsc 调用之前和之后添加一个 lfence 指令(仅限 x86)。

运行示例:cargo bench --features "tsc-trace/capacity_1_million"以显示使用此库与直接调用rdtsc两次并相减之间的运行时开销差异。

查看器

依赖于SDL2(https://crates.io/crates/sdl2)和bytemuck(https://crates.io/crates/bytemuck)。

tsc-trace收集的周期视觉表示。

通过命令行参数获取由write_traces_binary写入文件的跟踪,格式:(文件路径)(跨度范围开始)(跨度范围结束)(标签范围开始)(标签范围结束)

文件路径是必需的,如果未提供,则默认起始参数为0,结束参数为u64::MAX。

跨度开始和结束范围是以文件中第一个跟踪开始后的时钟周期数。

使用Q、W、E缩小、放大和重置。

使用A、S、D向右移动、向左移动和重置。

单击跨度将显示标签和跨度长度。如果跨度太小,每个像素可能会绘制多个(这些实例使用较浅的颜色集表示),则此功能将不起作用。

可以通过编辑config.js将标签数字替换为字符串。

依赖项

~135KB