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 调试
每月下载量 126
14KB
221 代码行
tsc-trace
通过 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