Repository navigation
[C++] Honor TS_2DIFF floating-point precision properties in writers - #1024
jixuan1989 wants to merge 5 commits into
Conversation
There was a problem hiding this comment.
🟡 Changes recommended
Accepted precision values can collide with reserved metadata markers and produce unreadable zero-only pages.
1 open issue
What changed in this PR
Fixes #1020 by passing floating-point TS_2DIFF precision properties through C++ writer initialization.
Changes:
- Preserve schema properties and propagate them to value encoders.
- Match Java precision parsing and NaN rounding behavior.
- Add parser, encoder, and writer regressions.
| File | Description |
|---|---|
| cpp/test/writer/ts2diff_precision_properties_test.cc | Tests precision across writer paths. |
| cpp/test/encoding/encoding_props_test.cc | Tests parsing, factory configuration, and rounding. |
| cpp/src/writer/value_page_writer.h | Declares property-aware initialization. |
| cpp/src/writer/value_page_writer.cc | Passes properties to value encoders. |
| cpp/src/writer/value_chunk_writer.h | Declares property-aware initialization. |
| cpp/src/writer/value_chunk_writer.cc | Forwards properties to value pages. |
| cpp/src/writer/tsfile_writer.cc | Preserves and propagates schema properties. |
| cpp/src/writer/page_writer.h | Declares property-aware initialization. |
| cpp/src/writer/page_writer.cc | Configures encoders with properties. |
| cpp/src/writer/chunk_writer.h | Declares property-aware initialization. |
| cpp/src/writer/chunk_writer.cc | Forwards properties to pages. |
| cpp/src/encoding/ts2diff_encoder.h | Handles NaN during integer rounding. |
| cpp/src/encoding/encoding_props.h | Adds Java-compatible precision parsing. |
| cpp/src/encoding/encoder_factory.h | Applies floating-point precision properties. |
Review effort: Balanced
| const int precision = detail::max_point_number(props); | ||
| if (precision == 2) return encoder; // Already the encoder default. |
There was a problem hiding this comment.
Confirmed by reproduction. On the published PR head, the added regressions fail in 32 zero-only writer variants plus one encoder boundary test. Both FLOAT and DOUBLE are affected, at precisions 2147483646 and 2147483647. The leading precision is interpreted as a bitmap marker, and C++ rejects the following zero count.
I have tested a local fix that forces the existing scaled-value bitmap wrapper for these two precisions, retaining an all-scaled bitmap and writing the actual precision after it. Both existing decoders understand that position as a precision value. The local fix passed 87 focused tests, 992 Windows tests and 1013 Linux tests. All 64 added C++ boundary pages were readable by Java; 8 additional C++ zero-only files passed both own and Java reads.
One compatibility detail: the current Java encoder itself emits unreadable zero-only pages for these two precisions (16 raw pages and 8 full files reproduced). Copying those bytes would reproduce the bug; the explicit existing wrapper is required. These invalid Java outputs are recorded as failures, not counted as interoperability passes.
The fix has not been pushed yet: our performance gate detected a small reproducible FLOAT record slowdown (125 paired runs, median ratio 1.0172, 95% CI [1.0062, 1.0244]). I am investigating that before publishing the revision and will update this thread with the validated commit and evidence.
AI disclosure: This response, reproduction and reported local validation were prepared/performed by OpenAI Codex.
AI 使用说明: 本回复、复现及报告的本地验证由 OpenAI Codex 编写或执行。
There was a problem hiding this comment.
Validated update for 1e8d230805d5823f1e0cd7a82af4e815510080e0: the fix is now pushed to this PR.
The two reserved precision values now force the existing scaled-value bitmap wrapper in both floating-point flush paths, even when every value is scaled zero. The actual precision follows the count/bitmap and is read as a value by both existing decoders. Empty pages still emit nothing. The new zero-only regressions failed 33 tests before this correction and pass afterward.
The final revision also makes Java rounding exact at half-neighbors and large integers: the old floor(x + 0.5) can round twice. An IEEE-significand implementation matches Java on 1,088,975 deterministic random/edge inputs for both saturated int32 and int64 results (the legacy int64 floor approximation differs on 251). Actual NaN inputs keep the existing raw-bit handling; zero multiplied by an infinite scale rounds to zero. The record schema-check helpers borrow the caller-owned DeviceID instead of copying its shared_ptr on every record; they retain no reference and public APIs/object layouts are unchanged.
Final local validation:
- 88 focused tests; Windows 993 passed / 3 skipped / 10 existing disabled; Linux 1014 passed / 1 skipped / 10 existing disabled. Linux enables all six optional codecs.
- Original 122 page cases and another 122 cases with rounding boundaries: bidirectional decode and exact Java/C++ bytes all pass. Complete files: 64 original own/cross reads plus 16 additional C++ zero-file own/Java reads pass. Native compressed fixtures: C++ reads 135 Java files and Java reads 117 C++ files.
- All 64 additional C++ boundary pages are readable by Java. The 16 Java-generated ambiguous zero-only pages remain explicitly recorded as invalid Java inputs; they fail Java's own reader too. Of 48 valid Java boundary pages, 36 match raw bytes and 12 one-value pages differ only in the pre-existing unused zero-delta minimum field.
- Changed executable lines: 97/97 (100.00%); corresponding branches 44.78%, with no branch exclusions or ignored parse errors. Format and patch checks pass.
The earlier performance signal was investigated rather than omitted. Final paired latency ratios (same benchmark source/configuration, 125 retained pairs for FLOAT record including the fixed-size confirmation; 25 pairs for each other workload):
float_nonaligned_record_default: 1.0000, 95% CI [0.9941, 1.0049].double_nonaligned_tablet_default: 0.9812, 95% CI [0.9662, 0.9901].float_aligned_tablet_precision_2: 0.9822, 95% CI [0.9756, 0.9868].double_aligned_record_precision_2: 0.9999, 95% CI [0.9910, 1.0044].
No statistically distinguishable slowdown was observed in this final matrix; the report retains earlier slower versions and all measurements. This is evidence for these workloads, not a claim about every possible workload.
Validation report · Logs, sources, coverage and measurements
AI disclosure: This response, implementation, tests and reported local validation were prepared/performed by OpenAI Codex.
AI 使用说明: 本回复、实现、测试及报告的本地验证由 OpenAI Codex 编写或执行。
There was a problem hiding this comment.
Sanitizer follow-up in 75592b89d1523a96090e8bca1dcb4cd2180162e5: both Ubuntu ASan jobs found a lifetime error in my new zero-page test. DecoderFactory::free does not call the decoder destructor, so its bitmap vectors leaked 424 bytes in 32 allocations. The test now uses scoped concrete decoders. No production code changes. The original test reproduces the same leak locally; the revised 7 encoding tests and full Linux Debug ASan suite (1014 passed, 1 skipped, all six codecs enabled) pass with leak detection on. Windows Release: 993 passed. Production source and prior measured artifacts are SHA-256 identical, preserving the previously reported compatibility, coverage and performance evidence. Supplementary report · Logs and reproduction.
AI disclosure: This correction, response and reported validation were prepared/performed by OpenAI Codex.
AI 使用说明: 本修正、回复及报告的验证由 OpenAI Codex 编写或执行。

Warning
Measured query-performance regression; necessity has not been established.
The confirmed end-to-end comparison for production head
75592b89d1523a96090e8bca1dcb4cd2180162e5retains these regressions versus the upstream baseline:These are block medians under the documented warm-cache Windows/MSVC protocol on one physical core's two SMT siblings; they are not universal workload estimates. Full-result timing includes materialization and validation. The application filter includes full native materialization cost.
The compatibility fix is required, but evidence that this query slowdown is a necessary cost is still missing. Reader-code equality and whole-thread instruction-cache hints do not establish necessity. The private link-order, cold-factory and quotient-rounding remedies did not remove the dense-query signal and were rejected; no performance-only source change was pushed. Investigation remains open. This is not a no-regression result or an accepted necessary performance trade-off. Correctness, coverage and write measurements are reported separately below.
Confirmed matrix and uncertainty · Latest rejected candidate and all samples. Previously declared unmeasured scopes remain.
中文:已测得查询性能退化,尚未证明这是修复所必需的代价。
当前生产提交
75592b89d1523a96090e8bca1dcb4cd2180162e5相对上游基线的确认性端到端比较,仍有以下完整查询延迟上升:上述数值是在已记录的 Windows/MSVC 暖缓存协议下,使用同一物理核心的两个 SMT 逻辑处理器得到的区块中位数,不代表所有工作负载。完整查询计时包含结果物化和校验;应用层过滤也包含完整的原生结果物化成本,不能视为原生 FIELD 下推的性能。
兼容性问题需要修复,但尚无证据证明这些查询退化是必要代价。 读取代码相同,以及整线程指令缓存计数的线索,都不能证明必要性。私有链接顺序、冷工厂拆分和商值舍入候选未消除稠密查询信号,已被否决;未推送这些性能候选修改。当前尚未定位可修复的查询原因,已有有界诊断已结束;这不是“无退化”结果,也不是已接受的必要性能取舍。正确性、覆盖率及写入性能的证据分别报告,不能代替查询性能门槛。
最新事件地址诊断中的
read_buf只是观察热点,尚未建立因果关系或必要性。采样环境下的 +1.85% 查询延迟不能替代上述验收结果。事件诊断报告。上方链接保留确认矩阵、候选失败记录及全部样本,正文仍列出未测范围。查询性能门槛仍未通过。A
FLOAT/DOUBLEmeasurement configured withTS_2DIFFandmax_point_numberstill used the C++ encoder's default precision of 2. With the issue's single input1.23456, precision0produced1.23instead of Java's1.0; precision4likewise produced1.23instead of1.2346.Fixes #1020.
Why the schema property did not take effect
There were two independent breaks in the writer path:
MeasurementSchemafrom four scalar fields, omittingprops_. The fix explicitly copies the property map. It does not copy the schema's internal writer pointers, whose ownership must remain independent.The existing init overloads delegate using an empty map. The existing two-argument factory implementation stays unchanged; its new overload calls it before applying the property. Class layouts remain unchanged. Property parsing occurs when the encoder is created; it is not added to each row's write path. Precision
2reuses the encoder's existing default without a redundantpowcall. Encoder resets preserve the configured precision between pages.Matching Java's boundary behavior
The parser follows a fresh Java
TSEncodingBuilder.Ts2Diffinitialized from properties: a missing key uses the existing default2; a valid negative value falls back to2; malformed or overflowing signed integers leave the fresh builder's precision at0. Signs, leading zeroes and BMP decimal digits accepted byInteger.parseIntare handled explicitly, without locale-dependent parsing. Supplementary digits, whitespace, trailing text and malformed UTF-8 are rejected.Very large precision makes the scale infinite; zero times that scale is NaN. Java rounds it to zero, while casting it to a C++ integer is undefined. The old
floor(x + 0.5)approximation also rounds twice: it returns 1 just below 0.5, and can change already-integral values above 2^52. Those differences remain observable after wiring precision 0, so they must be corrected in this precision-compatibility fix. The helper now rounds the IEEE significand with unsigned integer arithmetic. Values with magnitude below one half return zero; NaN returns zero; out-of-range exponents saturate. For fractional values, compare the discarded bits with half a unit, adding one to the threshold for negative numbers so exact ties round toward positive infinity. Already-integral values use a bounded left shift, and the result is clamped before a signed cast. This follows Java Math.round semantics without a floating-point addition or floor call. The existingFORCE_INLINEmacro keeps the small rounding/conversion helpers inline; actual NaN input still follows the existing raw-bit path.An actual Java oracle checks 1,088,975 deterministic random/edge inputs against both 32-bit saturated and 64-bit results; all match. The legacy floor approximation differs on 251 inputs. The original 122-case wire matrix still matches byte-for-byte, and another 122-case matrix including half-neighbors and large odd integers also matches byte-for-byte.
Reserved precision markers and zero-only pages
2147483646and2147483647are valid parsed precisions but also the two leading bitmap tags. Infinite scaling of zero rounds to integer zero, so every scaled flag is set andhas_overflow()is false. Writing the precision directly then makes both decoders interpret the following integer block as a bitmap header; the C++ reader rejects its zero count withE_DECODE_ERR.Both floating-point
flush()paths now also enter the existing bitmap wrapper when the precision is one of these two tags. They write the normal scaled-value marker, count, all-scaled bitmap, actual precision and integer blocks. The precision after the bitmap is read as a value without recursively interpreting it as a marker. This uses the existing Java/C++ wire layout, changes neither decoder, and adds work only when a page is sealed. Empty pages still write nothing.The record schema-check helpers also borrow
DeviceIDthrough a const reference to the caller-ownedshared_ptr, avoiding an unnecessary ownership copy/refcount update on every record. They only look up the ID and never retain the reference; the caller owns it throughout the call, including when a temporary is bound for the full expression. This changes private helper parameters, preserves public APIs and object layouts, and keeps error returns unchanged.The first wrapper implementation showed a reproducible FLOAT record slowdown (125 pooled pairs, median 1.0172, 95% CI [1.0062, 1.0244]). Bitmap-helper and inlining-only experiments did not resolve every record signal; those were rejected. MSVC disassembly and all source snapshots/measurements are retained. The final source also corrects the rounding approximation as explained above; the four-workload results below use that source.
The regression matrix covers both types, precisions
1000,2147483645and both reserved tags, 1/8/129/260 values, signed zero, reset/repeated pages and every existing writer path. Important compatibility limit: current Java itself emits unreadable zero-only pages for the two reserved precisions (16 raw pages and 8 full files reproduced). The fix deliberately emits a valid wrapper rather than copying those invalid bytes. All 64 additional C++ pages are readable by Java; 48 valid Java pages are readable by C++. Of those 48, 36 match byte-for-byte and 12 one-value pages differ only in the pre-existing, unused zero-delta block minimum (MAX_VALUEin Java,0in C++); the comparison normalizes only that unused field. The remaining 16 Java pages fail Java's own decoder and remain invalid input for C++. Eight additional zero-only C++ files pass own/Java reads (16 successful reads). These limits are retained in the raw evidence.Local validation
1180b13675e11a0230708af2cc70d037e0e12623and pass all 49 with the fix. They cover FLOAT/DOUBLE, aligned/nonaligned, copied/owned schemas, record/Tablet writes, multiple pages/chunks and table value-chunk encoding. Seven parser/factory/boundary tests and 32 additional zero-only writer variants pass: 88 new tests total. The added marker regressions fail 33 tests against the previously published PR head and all pass after the marker fix.encoding_props.h: 100.00% lines, 96.77% branches. The detailed report lists every affected module. Byte-identical source/build headers are merged; no branch exclusions or ignored parse errors are used. Unexercised branches include allocation/exception paths.git diff --checkpass.Detailed local validation report · Raw logs, coverage, measurements and validation scripts
The table precision regression inspects the encoded value page directly. Non-empty table-schema property serialization is the separate issue #1017 / PR #1018; this branch remains independent of that change. These results establish the tested precision behavior and interoperability scope, rather than complete Java/C++ feature parity.
CI sanitizer follow-up
75592b89d1523a96090e8bca1dcb4cd2180162e5corrects only the lifetime of decoders in the new zero-page test.DecoderFactory::freereleases raw storage without invoking the destructor; using it leaked the decoded bitmap vectors (424 bytes in 32 allocations in both Ubuntu ASan jobs). The test now owns concrete decoders on the stack, so their destructors run on normal and fatal-assertion returns. No production file changes. The original test reproduces the exact leak locally; the revised seven-test ASan run and full Linux Debug ASan run pass (1014 passed, 1 skipped), with all six codecs enabled. Windows Release also passes 993 tests. Production source and measured artifact SHA-256 hashes match the preceding validation, so its compatibility, coverage and performance evidence remains applicable; no new benchmark run is claimed for this test-only change. Supplementary sanitizer report · Reproduction, logs and XMLQuery performance backfill (2026-10-18)
Added 32 native table-query scenarios over aligned/non-aligned chunks, row/batch APIs, 1/4 projected fields, time/TAG filters, sparse NULLs and parallel settings; application FIELD references include full native materialization cost. Two devices × 32,768 rows × four fields, 32 position-balanced process repetitions and three full checked queries/process. Open/initialization, cached schema lookup, setup, first decoded/accepted row, full-result latency/throughput, per-query p50/p95 and whole-process peak working set are retained. Query samples are clustered by process; no cold-cache, P99 or universal no-regression claim.
The initial matrix and 192-quartet independent confirmation show approximately 0.4–0.7% increases in some dense aligned DOUBLE comparisons with the mixed writer/reader caller. This is explicitly not an unconditional no-regression pass. All initial samples, the identical-object 32-case reader-only matrix, and independent 12-cell caller × CPU controls (192 pairs/cell) are published separately. The final control does not reproduce the slowdown: all reader-only confidence intervals include 1, and mixed-caller point estimates reverse direction. Its same-file pairs differ from the earlier quartets, so the session/protocol-dependent sub-percent signal remains unresolved; unchanged reader source/object sections do not erase it or establish a cause. No new production commit was made. Precision-0 product comparisons use integer-valued inputs so both writers return the same values; Java verifies actual page precision 2 versus 0. Existing write/coverage and bidirectional correctness evidence is retained.
One initial ordering attempt was stopped after its self-check found unequal execution positions; those samples are preserved and excluded from conclusions. The corrected order gives each variant every position equally. Every native returned cell/NULL/timestamp and Python row/checksum expectation is checked. Java independently audits all valid C++ products and actual value-page codecs/counts/precision; five new helper sanitizer scenarios pass with Linux leak detection.
Query backfill report · Sources, actual products, raw timing arrays and controls
Query signal diagnosis (2026-10-18)
A finite, pre-recorded follow-up runs 12 launch/binary-control cells × 96 position-balanced quartets, with 3 complete checked queries/process (4,608 measured processes). All 24 same-binary negative-control latency contrasts have 95% intervals including 1, while all 12 actual baseline/fixed latency contrasts have intervals wholly above 1. In the four end-label comparisons, dense aligned DOUBLE row queries increase about 0.5–0.6% and batch queries about 0.8–1.0%. Both post-create and pre-resume affinity modes retain the signal, so affinity timing alone does not explain it in this round. The previous opposite-direction controls remain published; no claim of stable behavior across every session is made. These are correlated exploratory block-bootstrap contrasts, without multiplicity-adjusted inference.
Retained stage data places most of the earlier difference after query setup, about 13–25 µs/query in selected comparisons, including native read/decode, materialization/validation and close. Map sidecars preserve the original reader-only code bytes; all 60 differing code bytes are 52 address-reference instructions targeting common exact linker symbols. Thirty selected mixed-caller query/main/validation/cleanup functions also match before linking, including relocation targets. This narrows the investigation but proves neither identical cache behavior nor a source-level cause. Mask 12 uses two SMT siblings on one physical core. Main-thread lifetime cycles include startup/exit; some short-process OS CPU times are zero and corresponding comparisons are unavailable. The analyzer's initial zero-time division failure is retained and repaired by reanalysis only; no samples were rerun or replaced.
The query gate remains qualified and uncleared. No production change or new upstream source commit was made. Existing Java/coverage/write evidence retains its original scope; earlier query data and all anomalies are preserved. Diagnostic report · Fixed plan, all raw arrays, code maps and reproduction
Matched caller and image controls (2026-10-18)
Two separately fixed diagnostic stages each run four cells × 192 balanced quartets, three complete verified queries/child: 6,144 measured processes and 18,432 queries total. First, original mixed versus single-object reader-only callers use the identical suspended-launch/affinity/file/query protocol. Both caller-interaction intervals include one while reader-only also shows upward latency ratios; this does not support blaming only the mixed caller, nor prove caller equivalence. Ratios below are block medians with 95% block-bootstrap intervals; all raw samples and internal repeat-label controls are retained.
After those results, the second stage records a new plan: exact reader-only binary bytes are copied to four neutral paths, with baseline/fixed assignments rotated every eight-round block and SHA-256 checked. Each neutral path carries each version equally. Warmup occurs after copying, before timed queries. This changes image identity/loading context without patching static code/data/RVAs, but path, backing allocation, loader/cache history and possible ASLR choices change together. Loaded bases and physical/cache hardware counters are unmeasured; the interaction is diagnostic, not proof of a filename-only cause.
The original-path reader-only ratios are about +0.75–0.78%, while exact-byte neutral copies are near zero with intervals including one; both image-identity interactions are below one. Thus the loading/file-identity context measurably affects the comparison without a code patch. The concrete repair is to counterbalance identities in the benchmark, rather than introduce a numeric margin or alter production padding. The full original 32-case corpus is remeasured at 64 quartets/case, balancing reader versions and writer products across neutral image/data paths. Each initially signaled case gets one independent 192-quartet confirmation under the unchanged rule (paired median CI above1, median >1.03 or descriptive p95 >1.10). There are 7 such confirmations; remaining signals:
{"DOUBLE_aligned_p2_null0_props0_all_w4_row_parallel0": ["reader_on_baseline_file", "reader_on_fixed_file", "end_to_end"], "DOUBLE_aligned_p2_null0_props0_all_w4_batch_parallel0": ["reader_on_baseline_file", "reader_on_fixed_file", "end_to_end"], "DOUBLE_aligned_p2_null1_props0_app50_w1_batch_parallel0": ["end_to_end"]}.The corrected comparison still has unresolved confirmation signals, so the query gate remains uncleared. Remaining end-to-end block-median effects:
DOUBLE_aligned_p2_null0_props0_all_w4_row_parallel0+1.06%;DOUBLE_aligned_p2_null0_props0_all_w4_batch_parallel0+1.27%;DOUBLE_aligned_p2_null1_props0_app50_w1_batch_parallel0+0.45%. The image-identity correction is not a complete explanation for remaining repeated mixed-caller signals. This is measured-scope evidence under corrected comparable conditions, not a claim that every original image identity has zero latency difference. The original fixed-identity effect and all contradictory sessions remain published. Open/cached schema, first row, full latency/throughput, p50/p95 and whole-process peak memory are reported; cache is warm and P99/formal tail non-inferiority unmeasured. Original map sidecars preserve.text/.pdata, with.rdatadifferences only at debug timestamps. Production source and binary hashes remain unchanged; Java/coverage/write evidence retains its scope. Caller/image and corrected matrix report · Plans, complete arrays, actual products, maps and reproduction中文说明
配置了
TS_2DIFF和max_point_number的 FLOAT/DOUBLE 测点仍使用 C++ 默认精度 2。同一个输入1.23456,精度0原来读回1.23,Java 为1.0;精度4原来仍是1.23,Java 为1.2346。问题有两处:单个 schema 的注册重载只复制四个标量字段,丢失
props_;即使注册时保留了属性,chunk/page writer 初始化编码器时也没有传递它。现在显式复制属性,并通过非对齐、对齐及表模型的 value chunk/page writer 传给编码器工厂,在首次编码前设置浮点 TS_2DIFF 精度。显式复制属性可以避免误复制 schema 内部 writer 指针及其所有权。保留原有 factory/init 重载及类布局;原有 init 重载使用空属性委托,原双参数工厂实现保持原样,新重载先调用它再应用属性。参数只在编码器初始化时解析,精度
2复用编码器已有默认设置、避免重复调用pow,跨页 reset 保留精度。解析遵循新建 Java
TSEncodingBuilder.Ts2Diff的实际行为:缺少键或合法负数使用默认精度2,格式错误或整数溢出使该 builder 保持精度0;支持符号、前导零及 JavaInteger.parseInt接受的 BMP 十进制数字。补充字符数字、空白、尾随文本和无效 UTF-8 不被接受。极大精度使缩放系数无穷,零乘它产生 NaN;Java 返回零,C++ 直接转整数则未定义。原有floor(x + 0.5)还存在二次舍入:略小于 0.5 的数会得到 1,2^52 以上的某些整数也会改变。精度 0 接线后这些输入仍会与 Java 不同,因此本项同时修正舍入路径。现在按 IEEE 有效数进行无符号整数舍入:小于半个单位返回零,NaN 返回零,指数越界饱和;将舍弃位与半个单位比较,负数的阈值再加一,使恰好半值向正无穷方向舍入;已为整数的值只做有界左移,并在有符号转换前截断到范围。遵循 Java Math.round 语义,避免浮点加法及 floor 调用;舍入和转换辅助函数使用现有FORCE_INLINE,实际 NaN 输入仍走原始位路径。Java 实际生成的 1,088,975 个随机/边界输入与 32 位饱和及 64 位结果全部一致,旧 floor 公式有 251 个差异。原有 122 组 wire 矩阵仍逐字节一致,新增包含半值相邻数及大奇数的另一套 122 组矩阵也逐字节一致。两个合法精度值
2147483646、2147483647同时也是格式开头的位图标记。全零输入乘无穷并按 Java 规则舍入为零后,所有 scaled flag 都置位,has_overflow()为假;若直接写精度,解码器会把后续整数块当成位图头,C++ 因读到零数量而返回E_DECODE_ERR。现在 FLOAT/DOUBLE 的flush()遇到这两个精度时,也进入现有位图包装,依次写 scaled-value 标记、数量、全部置位的 scaled 位图、实际精度和整数块。位图之后的精度作为值读取,不再递归当成标记。两边现有 decoder 都支持这个布局,无需修改;只在封页时增加判断,空页仍不输出。record 的 schema 检查辅助函数改为通过 const 引用借用调用方的
shared_ptr<DeviceID>,避免逐条复制所有权及增减引用计数。函数只查找、不保留引用;调用方在整个调用期间拥有对象,临时参数也存活到完整表达式结束。只改私有辅助函数参数,公共 API、对象布局和错误返回保持原样。新增测试覆盖两种类型、
1000、2147483645及两个保留值、1/8/129/260 个值、正负零、reset/重复页和全部 writer 路径。兼容性限制:当前 Java 自己也会为两个保留精度产生无法读回的全零页,已复现 16 个原始页及 8 个完整文件;因此修复采用可解码的现有包装,不复制这些无效字节。新增 64 个 C++ 页均能被 Java 读取,48 个有效 Java 页能被 C++ 读取;其中 36 个原始字节相同,12 个单值页只在原有、未使用的零 delta 块最小值字段不同(Java 为MAX_VALUE,C++ 为0),比较时仅规范化该未使用字段。剩余 16 个 Java 页在 Java 自身和 C++ 中都无法读取。新增 8 个全零 C++ 文件自身/Java 读取共 16 次通过;原始证据保留这些边界。初版包装实现在 FLOAT record 出现可重复变慢(合并全部 125 轮,中位比 1.0172,95% CI [1.0062, 1.0244])。位图辅助函数及仅强制内联的实验未消除全部 record 信号,均未采用;生成代码、源码快照及所有测量保留。最终版本还修正了上述舍入近似问题,下方四组结果对应最终源码。
验证结果:相同 49 项 writer 回归在原版有 33 项失败,修复后全部通过;另有 7 项解析、工厂和边界测试及 32 项全零 writer 变体,共新增 88 项。新增标记回归在此前 PR 提交有 33 项失败,修复后全部通过。Windows 全量 993 项通过,Linux 全量 1014 项通过。122 组编码页双向解码且字节全部一致;完整 tree 文件 16 组配置、32 个文件、64 次读取通过,另通过 135 个 Java 文件和 117 个 C++ 文件的原生互通矩阵。
修改生产可执行行覆盖率 100.00%(97/97),相同行的分支覆盖率 44.78%;新解析头文件行覆盖率 100.00%,分支覆盖率 96.77%。统计合并逐字节相同的源码与构建头文件,不排除分支、不忽略解析错误;完整报告逐项列出受影响模块,尚有分配失败及异常分支未覆盖。
4 组等价输出 Release 性能对照,record 写入各 500,000 行、Tablet 写入各 5,000,000 行;两边编译同一份独立性能驱动、使用相同选项,每种变体预热 2 次、交错测量 25 轮并固定 CPU;FLOAT record 预先固定增加 100 轮确认,保留并合并全部 125 轮。修复/基线配对耗时比中位数为 1.0000, 0.9812, 0.9822, 0.9999。本次所测工作负载未观察到可分辨的退化。 每轮完整读回校验;计时包含创建文件、注册、写入和关闭,Tablet 构建与读回不计入写入耗时,峰值工作集包含整个进程。原版非默认精度的输出错误,不能充当等价输出的性能基线。
表模型精度测试直接检查编码后的 value page;非空表 schema 属性的序列化由 #1017 / #1018 单独处理。本分支不包含那项修改。上述结果对应已测精度与互通范围。
CI ASan 后续修正
75592b89d1523a96090e8bca1dcb4cd2180162e5仅调整新全零页测试中的 decoder 生命周期。DecoderFactory::free只释放原始内存而不析构,导致两个 Ubuntu ASan 任务均报告位图 vector 泄漏 424 字节、32 次分配。测试改为栈上对象,正常及致命断言返回均执行析构;无生产代码修改。本地修改前可复现同样泄漏,修改后七项 ASan 专项及 Linux Debug ASan 全量通过(1014 通过、1 跳过),六种 codec 均开启;Windows Release 993 项通过。生产源码及此前测量程序的 SHA-256 一致,沿用同一实现的兼容性、覆盖率和性能证据,未声称为本次测试修改重新测量性能。补充 ASan 报告 · 复现、日志和 XML查询性能补测(2026-10-18)
新增 32 个原生表查询场景,覆盖对齐/非对齐 chunk、行/批接口、1/4 个投影字段、时间/TAG 过滤、稀疏 NULL 和并行配置;应用层 FIELD 参考包含完整原生读取与物化成本。每文件 2 个设备 × 32,768 行 × 4 个字段,32 轮执行位置均衡的独立进程,每进程完整消费并核对 3 次查询。保留打开/初始化、缓存 schema 查询、查询构建、首个解码/接受行、完整延迟/吞吐、逐查询 p50/p95 和进程峰值工作集。统计按进程聚类,不声称冷缓存、P99 或所有场景均无退化。
初测及每场景 192 组独立四版本复查中,混合 writer/reader 调用程序的部分稠密对齐 DOUBLE 比较变慢约 0.4%–0.7%,因此未标为查询性能无条件通过。全部初测、相同编译对象链接的独立 reader 程序 32 场景,以及调用程序 × CPU 的 12 组控制(每组 192 对进程)均单独公开。最终控制未复现该变慢:所有独立 reader 置信区间均包含 1,混合程序的点估计反向;但其相同文件双版本配对协议与先前四版本协议不同,不能覆盖原始结果。这个与测量轮次/协议相关的小幅信号仍未解释,reader 源码和对象段一致不能抹去它,也不足以确认原因。本次没有生产代码提交。精度 0 产物比较使用整数输入,保证两个 writer 返回相同值;Java 核验实际页精度分别为 2 与 0。保留既有写入、覆盖率与双向正确性证据。
最初一次执行顺序存在位置不均衡,已中止并保留数据,不用于结论;修正后各版本在所有执行位置出现次数相等。原生程序逐单元格核验值/NULL/时间戳,Python 独立核验行数与校验和;Java 独立核验全部有效 C++ 产物及实际页编码/数量/精度。新增辅助程序的 5 个 Linux sanitizer 场景通过,开启泄漏检测。
查询补测报告 · 源码、实际文件、原始计时与控制实验
查询性能信号诊断(2026-10-18)
本轮事先固定计划,12 组启动/二进制对照 × 96 轮位置均衡的四标签,每进程完整核对 3 次查询,共 4,608 个计时进程。24 项同一二进制自身延迟对照的置信区间全部包含 1;12 项真实前后版本延迟比较全部大于 1。四项末标签比较中,稠密对齐 DOUBLE 的行查询约慢 0.5%–0.6%,批查询约慢 0.8%–1.0%;两种绑核方法均保留该信号,启动绑核时机不能单独解释本轮结果。以前反向的控制结果仍保留,不声称所有轮次都稳定一致。这些比较相互关联、属于探索性区块 bootstrap,未作多重比较校正。
历史分项显示差异主要位于查询构建之后,包括原生读取/解码、物化校验和关闭,所列比较约每次 13–25 微秒。地址映射旁路链接保持原始独立 reader 指令字节一致;60 个差异字节属于 52 条引用地址变化的指令,均指向同名精确链接符号。原混合调用程序所查 30 个查询/main/校验/清理函数的链接前代码及重定位目标也一致。这缩小了范围,但不能证明缓存行为一致或确定源码根因。亲和性 12 是同一物理核的两个 SMT 线程。主线程生命周期周期数包括启动/退出,部分 OS CPU 计时因短进程记为零,相应比较标为不可用;初次统计除零的失败日志保留,仅重新分析而未重跑/替换样本。
查询门槛仍有保留,未标为通过。 本轮没有生产代码或上游源码提交,既有 Java 兼容、覆盖率和写入证据沿用原范围;旧查询数据与异常样本全部保留。诊断报告 · 固定计划、原始数据、地址映射与复现资料
同协议调用程序与映像交叉对照(2026-10-18)
两个阶段分别事先固定四组 × 192 轮均衡四标签、每进程完整核验三次查询,共 6,144 个计时进程、18,432 次查询。第一阶段统一恢复执行前绑核、相同亲和性/文件/查询协议,对比原混合程序与单一编译对象的独立 reader。两项调用程序交互区间均包含 1,独立 reader 也有延迟上升,因此未支持“仅混合程序受影响”,也不能证明调用程序完全等效。上方第一表列出区块中位数和 95% 区块 bootstrap 区间,全部样本与重复标签负对照保留。
得到第一阶段结果后,另行固定第二阶段计划:四个中性路径轮换放入字节完全相同的两版原 reader-only 程序,每 8 轮更换分配,每条路径均等承载两版;副本核验 SHA-256,复制后单独预热再计时。静态指令/数据/RVA 不改,但映像文件背景、加载/缓存历史及可能的 ASLR 位置会一起变化,基址/物理映射/缓存硬件计数器未测,不能只归因于文件名。上方第二表保留全部主比较,详情见报告。
原路径的独立 reader 约慢 0.75%–0.78%,字节完全相同的中性副本接近零且区间包含 1,两项身份交互都小于 1,因此不改代码也能测到加载/文件身份背景的影响。具体修复在基准比较方法:平衡程序/数据路径上的两版 reader 与真实 writer 产物分配,不引入数值容忍阈值或修改 padding。完整原有 32 场景各测 64 轮,沿用区间完全大于1、中位数>1.03或描述性p95比>1.10的触发规则,对初测触发的 7 个场景各独立复查192轮;剩余信号为
{"DOUBLE_aligned_p2_null0_props0_all_w4_row_parallel0": ["reader_on_baseline_file", "reader_on_fixed_file", "end_to_end"], "DOUBLE_aligned_p2_null0_props0_all_w4_batch_parallel0": ["reader_on_baseline_file", "reader_on_fixed_file", "end_to_end"], "DOUBLE_aligned_p2_null1_props0_app50_w1_batch_parallel0": ["end_to_end"]}。纠正后的比较仍有未解决的复查信号,查询门槛未通过。 剩余端到端区块中位数效应为
DOUBLE_aligned_p2_null0_props0_all_w4_row_parallel0+1.06%;DOUBLE_aligned_p2_null0_props0_all_w4_batch_parallel0+1.27%;DOUBLE_aligned_p2_null1_props0_app50_w1_batch_parallel0+0.45%;映像身份纠正还不能完整解释这些重复出现的混合程序信号。这只适用于纠正后的可比条件,并不声称所有原固定映像身份都没有延迟差异,旧效应及反向轮次保留。打开/缓存schema/首行/完整延迟与吞吐、p50/p95及进程峰值内存均报告,冷缓存/P99/正式尾延迟非劣性未测。旁路地址映射保持原始指令/异常信息,rdata只允许debug时间戳差异;生产源码和原程序哈希不变,既有Java兼容、覆盖率、写入证据沿用原范围。调用程序/映像与纠正矩阵报告 · 计划、完整原始数据、真实产物、地址映射及复现Query layout intervention (2026-10-18)
Production source remains at
75592b89d1523a96090e8bca1dcb4cd2180162e5; the query gate remains uncleared. Two new fixed diagnostic stages total 4,608 measured children / 13,824 complete checked queries, plus 1,152 excluded warmup children. All three retained DOUBLE cases use baseline/fixed writer products that are byte-identical. All four payloads rotate over the same four neutral executable paths; common input identity, suspended-process affinity12 (one physical core's SMT pair), pool2, parallel=false, warm filesystem cache, 192 matched rounds/scenario/stage, block-bootstrap intervals. All raw samples and older contradictory sessions are retained.First, mixed versus reader-only images show a positive dense-batch caller interaction (1.007309 [1.002259, 1.014690]); row/sparse interaction intervals include1. This supports caller/link-contents dependence in dense batch but does not prove reader-only equivalence. Second, a private
/ORDERintervention relinks the exact original mixed objects/static libraries, with no source edit/recompilation, making three unchanged query functions' RVAs equal across versions. No production padding/alignment tweak was made. Other locations change together; no hardware counters or loaded bases were measured. Ratios below are fixed/baseline latency, block medians [95% intervals]; above1 means slower. This diagnostic is neither a production fix nor a replacement acceptance result.DOUBLE_aligned_p2_null0_props0_all_w4_row_parallel0DOUBLE_aligned_p2_null0_props0_all_w4_batch_parallel0DOUBLE_aligned_p2_null1_props0_app50_w1_batch_parallel0This intervention did not eliminate the dense-query cost: ordered dense batch is +1.43% versus original +0.92%; its original/ordered interaction interval is below1. The three equalized query-function RVAs are insufficient, and no production link-order/padding change is proposed. A new profile-based hypothesis is needed before further intervention.
Full report · Raw samples, plans, sources, maps and hashes. Full-query p50/p95, throughput, peak working set and open/metadata/first-row samples are retained. Cold cache/P99/compressed/parallel-scaling and the earlier stated scope gaps remain unmeasured. Earlier Java/coverage/unit/ASan/write results retain their original scope; no new runs of those suites are claimed.
新增四映像交叉与私有函数布局对照,均保留原始样本、预先固定轮数和原有严格门槛。三个场景的修复前后文件逐字节相同。密集批查询在混合读写程序与仅读程序之间存在交互信号;行/稀疏场景交互区间包含1,不能视为性能等价。私有诊断仅重新链接原目标文件/静态库,使三个查询热点地址一致,未改 PR 源码,也没有加入生产 padding/alignment。上表完整保留原构建与重排构建的比率和区间。它不是上游修复,查询门槛仍未通过,既有退化记录不会被覆盖。两阶段共4608个计时进程、13824次完整核对查询,另有1152个预热进程;指标与未测范围见报告。
这次干预没有消除密集查询成本,批查询原构建约慢0.92%,重排后约慢1.43%,相对代价进一步增大。仅统一三个热点地址不足以解决问题,不提出生产链接排列/padding 改动;下一步需由实际性能采样形成新的原因假设。
Thread sampling and PMU collection status (2026-10-18)
The production head remains
75592b89d1523a96090e8bca1dcb4cd2180162e5. The query gate is uncleared; no PMU data was captured. A separately fixed unprivileged experiment completed32 children ×1024 fully checked dense DOUBLE aligned batch scans (32768 queries), with66168 main-thread snapshots;66158 include theread_fixtureruntime-function interval. Exact original mixed images rotate through common paths, identical input, child affinity12 before resume, pool2, parallel=false, warm filesystem cache. Parent sampler affinity16. Two256-query smoke children and image-copy preflights are excluded from the fixed run.Median per-child suspension time is26.64% of process wall time. These are perturbed wall-time stacks, not CPU event counts or acceptance timings. Descriptive sample shares identify aligned batch decode for further attribution (6.82% baseline versus8.32% fixed), but that function's5608 COFF code bytes and all relocation tuples are identical. This has not established the cause of the approximately1% original regression. All original acceptance/confirmation results and contradictory sessions remain retained.
WPR lists the custom profile but actual start fails with
0xc5585011under the unelevated token; no recording is active. A bounded administrator capture script is prepared, its12-query preflight and PowerShell syntax pass; elevated capture and counter allocation are still unexecuted/unverified. It saves a local system trace and never uploads it. Only target-process filtered evidence may subsequently be published. The current archive normalizes absolute child module addresses to module/RVA while retaining every sample and native output. Original absolute-address files and failed helper smoke iterations remain local. No production/source/policy changes were made and no new Java/coverage/full-suite/write results are claimed.Report · Normalized child samples, native outputs, plans, maps and sources. The one-case stack exercise does not fill other previously declared query-scope gaps.
本轮固定完成32768次完整核对查询和66168个主线程快照;暂停采样的中位时间占比26.64%,干扰过大,只用于定位候选热点,不能作为约1%退化的归因或性能通过证据。批量对齐解码的机器码和重定位目标在两版中一致,仍未确定根因。WPR因普通权限报错0xc5585011,尚无有效硬件计数器采集;管理员采集脚本的12次预检与语法检查通过,真正录制未执行。系统ETL仅留本地,未来只能发布目标进程过滤的数据;当前公开子进程采样已按模块/RVA标准化,原始地址数据和开发失败样本在本地保留。源码及原验收证据未变,查询门槛仍未通过,未扩大原兼容性/覆盖率/写入声明。
Completed PMU capture and rejected footprint candidate (2026-10-18)
This supersedes the earlier pending administrator-capture status. The original production head remains
75592b89d1523a96090e8bca1dcb4cd2180162e5. The query-performance gate remains uncleared. Completed32 measured children ×1024 fully consumed/checked dense DOUBLE aligned four-field batch scans (32768 queries), excluding192 warmup queries and12 preflight queries. An earlier four-child capture lacks completion and is preserved/excluded. The exact original images and byte-identical writer products are unchanged.The ETL stopped successfully and stays local. Native
ProcessTracevalidation reports zero lost events/buffers, zero invalid target intervals/CPU switch-chain errors,32 target-main-thread starts/ends,510 valid intervals,88135 CPU samples and93109 stack records. Actual counter order comes from trace configuration, not XML order.DcacheMissesis all zero and unusable; raw CPU counter-status values are0 but their opaque HAL semantics are not independently calibrated.Eight-round paired descriptive median F/B changes: retired instructions +0.0171%, cycles +1.2106%, CPI +1.2002%, reported IcacheMisses +9.1903%, branch mispredictions −1.1713%, native full-query time +0.8800%. These are scheduled whole-main-thread counts (startup/kernel/queries/output/exit), not exact query-only counters. Elevated execution, WPR and1024 in-process queries differ from the original acceptance protocol. Within-version negative-control spreads are material; all rounds remain in the archive. The results support a locality/front-end hypothesis, not proven causality or an acceptance pass. Affinity12 selects SMT siblings on one physical core; measured sibling-busy medians1.6968%/1.4964% do not show more fixed-side median contention, but IRQ/DPC, other cores, power/frequency remain uncontrolled.
The sampled aligned batch function occupies6.716%/8.075% of query-frame CPU samples, yet its5608 COFF bytes and all relocation tuples match. A private maintainable candidate outlining the property-aware factory failed the intended code-footprint reduction:
.text+1840 bytes,.rdata+928 bytes versus a matched unchanged build. It was rejected before any timing search or production push. Its diff and section/hash evidence are retained. No new production test-suite/Java/coverage/write-throughput results are claimed; prior evidence and the three original residual regressions remain valid within their declared scope.PMU report · All target-filtered normalized samples/stacks, interval deltas, native outputs, verification script and rejected candidate. No system ETL, absolute runtime addresses or unrelated switch thread identities are uploaded. The included verifier recomputes interval totals and paired statistics without the ETL. Other previously declared query-scope gaps remain.
管理员采集已完成,32768次查询完整核对,预热/预检另计;没有报告的丢失事件、无效区间或CPU切换链错误。系统ETL仅留本地,公开数据已按目标进程过滤、模块/RVA标准化。退休指令约+0.02%、周期+1.21%、指令缓存事件+9.19%,支持继续排查局部性,但负对照有波动、数据缓存计数不可用、整线程计数不是精确query-only,尚不能证明原因或清除门槛。私有工厂拆分候选反增1840字节代码和928字节只读数据,已放弃,未挑选计时或推送源码;失败diff及证据一并保留。既有三项退化和所有历史样本不删除,原兼容性/覆盖率/写入证据沿用其原范围,本轮不冒充重新测试。
Algebraic rounding candidate rejected by query screen (2026-10-18)
Production head remains
75592b89d1523a96090e8bca1dcb4cd2180162e5; the query-performance gate remains uncleared. One private source candidate replaces the fractional rounding remainder/threshold calculation by an equivalent quotient expression. Subtracting one from negative magnitudes preserves exact-half ties toward positive infinity; exponent/NaN/saturation/integral gates are unchanged. It passes1088975 actual Java-oracle vectors for int32/int64 and122 freshly generated bidirectional page cases with122 exact byte matches. Matched Release.textdecreases64 bytes. The unchanged control reproduces the original.text exactly; its two differing.rdata bytes are verified PE debug timestamps.A single predeclared screen completes2592 measured children /7776 full verified queries across the three retained scenarios,144 six-label rounds/case,24 identity/time blocks. Baseline/current/candidate each use two copies rotating over the same six paths; path and execution-position balance and all hashes are checked. Warmup2592 queries and smoke54 queries are excluded. Affinity12 is one physical core's SMT pair, pool2, parallel=false, warm cache, uncontrolled host background/power. The current image is a matched unchanged-head rebuild; all baseline/fixed writer products for these cases are byte identical. Full query timing includes result materialization and validation.
Block-median changes [95% block-bootstrap intervals]:
Candidate rejected: both dense candidate/upstream intervals remain above1 in ratio form; every candidate/current interval includes1, so no reliable improvement or equivalence is established. All nine same-binary negative-control intervals include1. Sparse and previous contradictory results remain retained. No optional extension, sample trimming, margin relaxation, production source push or further expression/layout search. This rejects this remedy; it does not prove code footprint irrelevant or establish PMU causality.
Report · All raw samples, negative controls, verifier, one-file diff,122 wire fixtures, hashes and build/format logs. Open/metadata/setup/first-row/full arrays, p50/p95, throughput and peak working set are retained. This is a three-case private screen; original full-matrix gaps remain. No full candidate unit/sanitizer/coverage/full-file/compressed/write/32-case acceptance results are claimed; original production evidence retains its original scope.
本轮私有舍入简化通过1088975个Java样本和122组双向编码页字节校验,代码缩小64字节,但固定7776次查询未消除退化:候选稠密行约+1.005%、批约+0.956%,相对当前版的区间均包含0,不能认定改善。按预先规则放弃,没有推送源码、反复跑分或换表达式。所有样本、九项负对照、失败diff和实际限制均公开;候选的全量测试/覆盖率/写入等未继续执行,不能借用旧通过结果。原PR不变,查询门槛仍未通过;已完成的管理员录制不重复要求运行。
Completed calibrated event-address diagnostic (2026-10-19; capture 2026-10-18)
Query-performance gate remains UNCLEARED; necessity is not proven. The new capture saved/stopped successfully: 32 original measured children, 8,192 fully consumed/checked dense aligned DOUBLE p2 four-field batch queries; 192 warmups and 12 preflight queries excluded; 16 calibration children separate. No production source change. There are 160,111 target PMC address samples (25,289 source9 and 134,822 source25), 159,491 with matched stacks, zero reported lost events/buffers or malformed payloads. Actual intervals are verified. TID plus child-time windows handle two reused main-thread IDs; the raw 51 thread-start summary is not a 48-child lifecycle balance.
Code-stream calibration has 69–72 source9 body samples per round versus 1–2 for hot code, with source25 about 132–133. This supports a directional code-locality investigation, not independently calibrated L1I semantics. Eight-round descriptive medians: whole-thread source9 +6.78%, source25 −0.01%; query-frame source9 +7.31%, source25 −0.03%. Native full-query latency under sampling is +1.85% (round changes +0.86% to +5.05%); same-binary controls and all adverse samples remain. Sampling conditions differ from unsampled acceptance; perturbation was not measured, and these are not new acceptance intervals.
The largest source9 query-associated leaf increase is within
read_buf: 346→540 samples, higher in all eight rounds. Both original COFF bodies are 299 bytes with identical bytes and relocation targets, but linked positions differ. Stacks span TS2DIFF decoding, page headers/statistics and metadata reads; runtime/kernel leaves also contribute heavily. IP skid, public-symbol granularity and distributed events prevent a causal or unavoidable-cost claim. No new source/layout remedy was attempted. Original matrix results and all three residual scenarios remain; prior correctness/Java/coverage/write evidence retains its declared scope.Event-address report · Evidence upload status. The report is published and hash-verified. Complete original evidence is now public as 9 fixed parts: all parts were downloaded and reassembled to the original 4,084,418-byte ZIP SHA-256. Single-file API upload remains unavailable; browser extension file access is no longer required. Parts and SHA-checking reassembly script. ZIP SHA-256:
80b7373e253d0a0572d3cc5293d3a6c7938c7849a70a72b61abade68d36b9421. System ETL and absolute runtime addresses stay local. Both administrator actions are fulfilled; no rerun is requested.新采集已保存并停止,8192次正式查询完整核对,取得160111个目标地址样本,未报告丢失。代码流式校准支持局部性方向观察,不能冒充精确L1I语义。read_buf样本346→540、8轮均增,但299字节函数机器码及重定位相同,仅链接位置不同;调用栈涉及解码、页头/统计和元数据,内核/运行库也有事件。尚不能证明因果或必要代价。采样下约+1.85%的查询延迟受不同测量条件、负对照波动和未测采样开销限制,不替代原验收。查询门槛仍未通过,顶部警示和历史证据保留。报告已发布;完整原证据已按9片公开,下载重组后核对原ZIP的SHA-256一致。单文件API上传仍失败,但已无需浏览器文件权限。两次管理员操作均已完成,无需重跑。
Offline instruction/CPU attribution and stopped private probe (2026-10-19)
Offline replay of the original images further limits attribution: query-frame source9 samples are 11,186→11,991 (+805), of which read_buf contributes 346→540 (+194; 24.10% of the raw difference, not a latency fraction). Its largest single instruction-address increase is offset234, immediately after memcpy (source9 104→155, source25 495→524); IP skid prevents assigning those events to that instruction or memcpy. Caller groups span existing TS2DIFF decoding and page-header/statistics paths; the floating-precision page-header group is only 22→25. Both observed CPUs show higher conditional read_buf source9/source25 ratios, so the increase is not visible only after pooling CPU shares; this does not isolate scheduling/SMT. The 105 observed sample-to-sample CPU changes are not context-switch counts.
A private probe retained the exact 299-byte COFF function but changed the surrounding image. Its predeclared 32-quartet query guard completed 384 checked queries (768 warmups excluded): block-median +0.5347%, bootstrap95% [-0.1736%, +1.8029%], with shifted same-binary controls. It did not retain an upward signal, so direct-call timings were not executed; no rounds or layout variants were added. Neither analysis clears the original query gate, establishes cache-alignment causality or proves necessary cost. A subsequent original-reader audit verifies10 vtables/57 byte-identical method slots,72 normalized RTTI/data nodes,100 matching constant payloads and identical482-slot C++ initializer order. All719 differing .rdata bytes are accounted for, but static normalization does not prove runtime/cache equivalence; the external CRT type_info boundary remains. No new source or timings. Static data audit and limits · Data snapshots and offline verifier (original executable/COFF inputs remain local; this is not a full original binary/build archive). Bilingual report and scope · Machine-readable counts. The small assets are download/hash verified; the complete normalized event evidence is now public as 9 downloaded/reassembled SHA-verified parts, as disclosed above. No production change or new Java/coverage/write/full-query acceptance is claimed.
中文:原图像离线复核进一步限定了归因范围:查询帧源9为11,186→11,991,read_buf的194个增量仅占805个总增量的24.10%,不是耗时占比。最大单地址增量在memcpy返回后的offset234,源9为104→155、源25为495→524;采样IP偏移使其不能直接归因于该指令或memcpy。增量分散于已有TS2DIFF解码和页头/统计路径,浮点精度页头仅22→25。两个CPU内的描述性比值均上升,不能只用合并后的CPU份额差异解释,也不能由此隔离调度/SMT。观察到105次样本间CPU变化,不是上下文切换计数。
私有探针虽保留相同299字节函数,但周围图像已变。固定32轮、384次完整核验查询(768次预热另计)得到区块中位数+0.5347%、bootstrap95%[-0.1736%, +1.8029%],同二进制对照也偏移;未保留稳定向上信号,按事先规则停止,未执行直接调用计时、未追加轮数或换布局。两项分析均不能清除原查询门槛、证明缓存对齐因果或必要代价。 后续原reader核对确认10张vtable的57个实际方法指针字节一致,72个RTTI/数据节点规范化后相同,100个常量内容及482个C++初始化槽位顺序相同;719个只读段差异字节已全部归类。但这不证明运行时/缓存或性能等价,外部CRT type_info边界仍保留,未新增源码或计时。静态数据核查及边界和数据快照与离线复核器已公开;原exe/COFF输入留在本地,快照不是原二进制/构建整包。 小报告和计数摘要已下载核对哈希,完整标准化原证据已按9片公开并下载重组核对原SHA;没有生产修改或新增Java/覆盖率/写入/完整查询验收的通过声明。
Separate GCC/WSL query scope (2026-10-19)
The original Windows query gate remains UNCLEARED. Fresh pinned-source GCC11.4/Ubuntu22.04 WSL2 Release builds (stock O3/LTO; static; warm ext4) ran exactly 48 balanced quartets/case: 1,728 fully checked measured queries, 3,456 excluded warmups and 36 cross-writer smoke queries. Two copies/version, four common executable paths, execution positions and case order were balanced. Child guest CPUs2,3 were set/verified before exec, parent CPU4; guest topology does not independently control host mapping/SMT contention. All original/adverse arrays are retained.
The baseline dense-batch same-binary copy control shifts +0.2990% [ +0.0826%, +0.4332% ]; do not claim clean equivalence or general speedup. Compiler/OS/virtualization/LTO/filesystem/file-tail bytes change together, so this does not isolate compiler cause. Linux baseline/fixed writer products are byte-identical per fixture. A subsequent offline audit identifies all 69 Windows/Linux differing bytes as the order of three default entries in a 78-byte property block; every other byte is identical. Eight raw-property/Java metadata checks pass; Java normalizes raw NULL encryptKey to empty bytes at encryption level 0. Reordering entries only in memory reconstructs the other platform’s complete file exactly. The initial audit incorrectly expected Java to preserve raw NULL; its failed assertion/source/log are retained with the correction. This excludes a data-encoding difference, but proves neither zero metadata timing effect nor the cause of the original within-Windows regression (whose two writer products are already byte-identical). Footer audit and limitations · Eight frozen inputs, independent verifier, Java source/results and retained audit failure. No new query timings or production changes. After timing, Java fully checked4 Linux C++ products (32 chunks/1,024 pages each), and Windows/Linux C++ cross-reads added36 checked queries; those are separate correctness checks. No new Java→C++, coverage, sanitizer or write-throughput pass is claimed. app50 includes full materialization plus application filtering, projects only non-NULL v0 and is not native FIELD/NULL filtering.
Bilingual report including open/metadata/first-row/full-query/RSS scope · Complete GCC raw evidence ZIP. The 486,922-byte ZIP was downloaded and SHA-256 verified:
d48aa41913407a2c3963e48403fb04bbbc4b04d65413e8e48e1fa4156bbec1a7. No production source change, optional round extension, stopped-probe rerun or replacement of Windows evidence.中文:本轮是独立的GCC/WSL范围比较,原Windows查询门槛仍未通过。固定源码、标准O3/LTO Release、静态库、热ext4;三个场景各48轮,共1728次正式完整核验查询,3456次预热和36次交叉writer预检单列。路径、位置、副本及场景顺序均衡;exec前设置核对guest CPU2/3,父CPU4,不能冒充已控制宿主SMT映射/争用。变化及区间见上表,baseline batch副本对照+0.2990% [ +0.0826%, +0.4332% ]仍偏移,不能据此宣称性能等价或整体加速。编译器、OS/虚拟化、LTO、文件系统及文件尾字节共同变化,不能归为单一编译器原因。
Linux两版writer对应文件字节一致;后续离线核对确认,Windows/Linux的69处差异全部来自78字节属性块中三个默认属性的排列,其他字节完全一致。八份文件的原始属性与Java元数据检查通过;未加密等级0时Java将原始NULL密钥规范为空字节数组。仅在内存中调换顺序即可精确重建另一平台的整份文件。第一次核对误要求接口保留NULL的断言失败及修正源码/日志均保留。这排除了数据编码差异,但不证明元数据计时影响为零,也不能解释两版输入原本就字节一致的Windows内部退化。属性核对报告与边界及八份原始输入、独立复核器、Java源码/实际输出和核对失败记录已公开,未新增查询计时或生产修改。计时后Java完整读取4份Linux C++文件,每份32个chunk/1024个page;Windows/Linux C++互读另36次查询通过,均与性能统计分开。本轮未新增Java→C++、覆盖率、sanitizer或写入吞吐通过声明。app50包括全部物化成本,只投影非NULL v0,不冒充native FIELD/NULL过滤。中英报告和完整GCC证据ZIP均已发布并下载核对哈希;没有生产源码改动、追加轮数、重跑已停止探针或替代Windows原数据。
AI disclosure: The implementation, tests and description in this pull request were written by an AI coding agent (OpenAI Codex), which also performed the reported local validation.
AI 使用说明: 本 PR 的代码修改、测试和正文由 AI 编程代理(OpenAI Codex)编写,文中报告的本地验证也由该 AI 代理执行。