XPerf
语言C证据

cp-alloca-hot — 测量的堆栈增长,仍然提示

状态

提示。实时时钟 JSONL:cp-alloca-hot.jsonl。该文件是计时伴随文件。通过的测量如下堆栈覆盖。未进行语料库分拣。2026-10-22 的语料库裁定不涵盖此部分。在循环体中的 VLA 未匹配。

测量

clang 21.0.0,-std=c11 -O2。双方每次迭代写入两个字节,并保持一个易变累加器。前一方在每次循环中调用 alloca(64) 并保留第一个和最后一个块的地址,因此这些块会一直存在直到函数返回。Cover 是从最低字节到最高字节之后一个字节的距离。

角色案例堆栈字节操作
之后一个缓冲区6420000
之前每次迭代 alloca128000020000

相同触摸的挂钟,那 20000 次迭代循环的 80 次调用。之后的时间不是零。比例约为 1。

角色情况中位数毫秒操作次数比率
之后one_buffer0.29516000001
之前alloca_each_iter0.29316000000.993

这不是一般的加速。提示存在的原因是每次迭代都会增加另一个64字节的块。在栈已经驻留后,重用一个缓冲区并没有使两个字节的访问更快。

在一个 2000 次迭代的循环中,一个 64 字节的 VLA 占用了 64 字节。该槽被重复使用,因此该模式没有被匹配。

解阻条件

不要仅从这个文件将默认值设置为 error。如果每个块必须在函数返回之前保持活跃,一个缓冲区的重写是错误的,栈仍然会增长。在进行任何默认更改之前,仍然需要对语料库进行分类。