🟡 [M23] 小文件 single_frame_tail 与 head 重叠导致 render 数据误导 #42

Closed
opened 2026-06-05 11:54:15 +08:00 by dailz · 0 comments
Owner

问题

小文件(total ≤ 35 行)时,bench_single_frametail 位置 total.saturating_sub(35) 为 0,与 head 完全重叠,产生标记不同但数据相同的 benchmark 结果。

此外 total 在 36~104 行时,head/tail/middle 帧之间存在大量重叠区域,total=70 时 middle 与 tail 完全重叠。

根因

crates/bench/src/suites/render.rs 硬编码三个位置:

let positions = [
    ("head", 0),
    ("middle", total / 2),
    ("tail", total.saturating_sub(35)),
];

middle = total/2 在小文件时偏向 tail;阈值仅检查 total > 0,未验证帧间不重叠。

修复

  • 提取共享常量 FRAME_LINES = 35suites/mod.rs
  • 新增 select_frame_positions(total) helper:
    • total < 3 * FRAME_LINES 时只返回 head
    • total >= 3 * FRAME_LINES 时返回三帧,middle 居中于 head-end 与 tail-start 之间
  • bench_reverse_scantotal <= FRAME_LINES 时返回空结果
  • 9 个边界测试覆盖 0/1/35/70/104/105/1000/1M 行

PR

Fixes in PR #46 (fix/m23-single-frame-tail-overlap)

变更文件

文件 变更
crates/bench/src/suites/mod.rs +共享常量 FRAME_LINES
crates/bench/src/suites/render.rs +select_frame_positions() helper, 重写 bench_single_frame, +9 tests
crates/bench/src/suites/jump.rs bench_reverse_scan 小文件保护
## 问题 小文件(total ≤ 35 行)时,`bench_single_frame` 中 `tail` 位置 `total.saturating_sub(35)` 为 0,与 `head` 完全重叠,产生标记不同但数据相同的 benchmark 结果。 此外 `total` 在 36~104 行时,head/tail/middle 帧之间存在大量重叠区域,`total=70` 时 middle 与 tail 完全重叠。 ## 根因 `crates/bench/src/suites/render.rs` 硬编码三个位置: ```rust let positions = [ ("head", 0), ("middle", total / 2), ("tail", total.saturating_sub(35)), ]; ``` `middle = total/2` 在小文件时偏向 tail;阈值仅检查 `total > 0`,未验证帧间不重叠。 ## 修复 - 提取共享常量 `FRAME_LINES = 35` 至 `suites/mod.rs` - 新增 `select_frame_positions(total)` helper: - `total < 3 * FRAME_LINES` 时只返回 head - `total >= 3 * FRAME_LINES` 时返回三帧,middle 居中于 head-end 与 tail-start 之间 - `bench_reverse_scan` 在 `total <= FRAME_LINES` 时返回空结果 - 9 个边界测试覆盖 0/1/35/70/104/105/1000/1M 行 ## PR Fixes in PR #46 (`fix/m23-single-frame-tail-overlap`) ## 变更文件 | 文件 | 变更 | |------|------| | `crates/bench/src/suites/mod.rs` | +共享常量 `FRAME_LINES` | | `crates/bench/src/suites/render.rs` | +`select_frame_positions()` helper, 重写 `bench_single_frame`, +9 tests | | `crates/bench/src/suites/jump.rs` | `bench_reverse_scan` 小文件保护 |
dailz closed this issue 2026-06-07 08:31:21 +08:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: dailz/logViewer#42