cx-const-by-value — 已测量,仍然提示
状态
提示. 实时时钟 JSONL: cx-const-by-value.jsonl。未进行语料库分流。2026-10-22 的语料库裁定不涵盖此标识。
测量
clang++ -std=c++17 -O2(Apple clang 版本 21.0.0 (clang-2100.1.1.101))。参数情况调用另一个翻译单元中的函数,因此复制是 ABI 所生成的。每一方返回 size + first byte(或 size + first int)。测试程序在经过 3 次预热后,将返回值在 9 个计时轮中求和。校验和匹配。之后的时间保持在 0 以上。
| 角色 | 情况 | 中位数毫秒 | 操作次数 | 比率 |
|---|---|---|---|---|
在向量中的一个 int 之后, 常量引用 | 0.148417 | 200000 | 1 | |
在向量中之前的一个 int,按值常量 | 2.471000 | 200000 | 16.649 | |
| 之后 | 64字节字符串,常量引用 | 0.039792 | 40000 | 1 |
| 之前 | 64字节字符串,按值常量 | 0.610709 | 40000 | 15.348 |
| 在128字节字符串的range-for之后,常量引用 | 0.016042 | 20000 | 1 | |
| 前 | 128 字节字符串的 range-for,按值常量 | 0.329708 | 20000 | 20.553 |
| 在 64 位整型向量的 range-for 后,常量引用 | 0.005708 | 8000 | 1 | |
| 之前 | 64 位整型向量的 range-for,按值常量传递 | 0.122083 | 8000 | 21.388 |
相同形状,也高于基准线,在 JSONL 中未重复:一个 23 字节的字符串参数为 16.728×(1.700666 / 0.101667 毫秒,100000 次操作),32 字节 17.504×(1.423625 / 0.081333 毫秒,80000 次),256 字节 22.681×(0.462125 / 0.020375 毫秒,20000 次),4096 字节 59.952×(1.206541 / 0.020125 毫秒,20000 次)。一个 4 整数向量为 16.145×(2.396875 / 0.148458 毫秒,200000 次)。一个 1024 整数向量,访问第一个元素时,为 74.110×(1.120916 / 0.015125 毫秒,20000 次)。
同一文件的 4096 字节触碰,加上了一个易变的零,这样引用循环就不会消失,为 115.971×(1.178958 / 0.010166 毫秒,20000 次)。内联并没有消除那个复制。
限制
这些都保持在标准以下。扫描器仍会标记拼写错误,因为它无法看到长度或正文:
| 案例 | 前_ms | 后_ms | 操作 | 比率 |
|---|---|---|---|---|
| 4字符字符串参数 | 0.303834 | 0.301250 | 300000 | 1.009 |
| 空向量参数 | 0.371000 | 0.303334 | 300000 | 1.223 |
| 64字节字符串,对每个字节求和 | 0.356583 | 0.081708 | 20000 | 4.364 |
| 4096 字节字符串,每个字节求和 | 0.980375 | 0.767625 | 4000 | 1.277 |
| 4 字符字符串的 range-for | 0.020292 | 0.010625 | 40000 | 1.910 |
| 1024-整数向量,对每个元素求和 | 0.324125 | 0.151917 | 4000 | 2.134 |
匹配器是一行:const std::string / const std::vector<...>(以及 east-const 拼写),其名称后跟 , 或 ),加上 for ( 头部中 : 之前的相同类型。它会遗漏 const auto、下一行的名称、默认参数(=)以及嵌套的 >>。按值传递的非常量参数会被保留:在一个 4096 字节的字符串上,这个复制是 60.510×(1.235375 / 0.020416 毫秒,20000 次操作),它也是函数获取所有权的方式。局部的 const std::string copy = ... 会被保留。
默认保持 hint。这些比率不是通用加速。
解除阻塞
不要仅从这个文件将默认值设置为 error。一个短字符串、一个空向量,或一个读取每个元素的主体都可以抹去差异。在任何默认值更改之前,仍然需要对语料库进行初步筛选。