XPerf
语言Zig证据

zp-alloc-print-hot — 已测量,仍然提示

状态

提示. 实时时钟 JSONL: zp-alloc-print-hot.jsonl。未进行语料库分流。2026-10-22 的语料库裁定不涵盖此段。

测量

对一个运行时 u64 使用 std.fmt.allocPrint 20000 次,与格式化一次并重复使用切片相比。ReleaseFast,9 次的中位数。格式化的字节被混入到累加器中,因此循环结束后不会被删除。循环前后产生相同的累加器。

角色情况中位数毫秒操作次数比率
之后alloc_print_once0.020375200001
之前alloc_print_each_iter1.0168752000049.908
之后arena_print_once0.020333200001
之前arena_print_each_iter0.2354162000011.578
之后const_print_once0.025834200001
之前const_print_each_iter0.3629582000014.050

GPA 行是每次迭代的 std.fmt.allocPrint 加上 free,与一个 allocPrint 对比。arena 行在每次计时调用时通过 retain_capacity 重置,然后在循环内进行 allocPrint 而不释放。constant 行是 Allocator.print("hello", .{})。

同一二进制的另外两次运行保持在同一范围:GPA 50.795×和54.930×,arena 11.799×和11.576×,常量字符串 14.128×和15.445×。

std.fmt.bufPrint / std.mem.print 对相同整数的速度大约是 4.8× 到 5.3×,处于平均水平,因此这个规则不会标记缓冲区格式化。对一个短的 {s}:{d} 对的 bufPrint 在不同运行中变化在 5.9× 到 9.7× 之间,所以它也没有被包含在内。

每次迭代都会变化的值无法被提升。检查器仅在格式字符串和每个参数都是字面量或标识符,并且此循环没有赋值、捕获或声明时才报告调用。默认保持 hint。这个比率不是一般性的加速。

解除阻塞

不要仅仅从这个文件中将默认设置为 error。一个变化的参数、一个冷路径或另一个分配器都可能抹掉差异。在进行任何默认更改之前,仍需要对语料进行初步筛选。