1. 对外承诺指标
下列数字为软件侧 L2Bus 稳态循环(预创建 bus/slave,每次 New→fill→Cycle)的
实测下限,不含网卡中断与操作系统调度开销。典型工业周期仍按 ~100μs 规划。
~1 μs
最短周期 (x86-64)
~4 μs
最短周期 (ARM64)
~0.1 μs
最短抖动 (stddev)
~100 μs
典型 EtherCAT 周期
< 0.5%
核心热路径占比 (100μs)
~20 μs
L2Bus.Cycle 含创建开销 (x86)
~70 μs
L2Bus.Cycle 含创建开销 (ARM)
0 alloc
ecfr 编解码热路径
2. 测量方法
- 最短周期:
TestL2BusCycleJitter/BenchmarkL2BusSteadyCycle— 预创建从站后重复New→fill→Cycle,取多次testing.Benchmark的ns/op最小值。 - 最短抖动:同上多次运行的
ns/op标准差(stddev);峰峰值(max−min)另行记录。 - L2Bus.Cycle(含创建):历史
BenchmarkL2BusCycle,每次迭代重建 bus/slave,用于对照典型仿真开销。 - 热路径:
ecfrDatagramHeader Overlay/Commit、FrameOverlayReuse等零分配基准。
复现命令:
go test ./internal/sim -run=TestL2BusCycleJitter -v
|
go test ./internal/sim -bench=BenchmarkL2BusSteadyCycle -benchmem -count=5
3. 最短周期 / 抖动实测
| 指标 | x86-64 (i5-13500H) | ARM64 (RK3588s A55) | 依据 |
|---|---|---|---|
| 最短周期 (min) | 0.76 μs | 3.70 μs | TestL2BusCycleJitter |
| 平均周期 (mean) | 0.87 μs | 4.01 μs | TestL2BusCycleJitter |
| SteadyCycle bench | ~1.0–1.5 μs | ~4.0–4.5 μs | BenchmarkL2BusSteadyCycle |
| 最短抖动 (stddev) | 66 ns (~0.07 μs) | 108 ns (~0.11 μs) | run-to-run ns/op |
| 峰峰值抖动 | 350 ns | 515 ns | max − min |
| 对外承诺(圆整) | 周期 ~1 μs / 抖动 ~0.1 μs | 周期 ~4 μs / 抖动 ~0.1 μs | 保守圆整 |
4. 热路径基准(本次复测)
| 基准 | x86 ns/op | ARM64 ns/op | 分配 |
|---|---|---|---|
| DatagramHeaderOverlay | ~3.0 | ~7.75 | 0 |
| DatagramHeaderCommit | ~2.05 | ~4.9 | 0 |
| FrameOverlayReuse | ~10.5 | ~28.2 | 0 |
| FrameOverlay | ~62 | ~447 | 2 |
| ETHFrameWriteDown | ~1.83 | ~4.95 | 0 |
| FullPipeline | ~770 | ~1487 | 2 |
| L2BusCycle(含创建) | ~16–20 μs* | ~65–79 μs | 21 |
* x86 含创建开销沿用既有文档 ~20 μs;稳态最短周期见上表 ~1 μs。 核心编解码(Overlay+Commit ≈ 5 ns)占 100μs 周期 < 0.01%,远低于 0.5% 目标。
5. 结论
- 软件稳态循环已压到 微秒级下限:x86 ~1 μs、ARM64 ~4 μs,相对典型 100μs 周期分别留有约 99% / 96% 余量。
- 运行间抖动(stddev)约 0.1 μs,适合作为软件侧“最短抖动”对外说明。
FrameOverlayReuse/FrameOverlayPool保持零分配;ARM64 相对FrameOverlay仍有约 16× 加速。- 公共包 API 未变更;新增仅为测试与文档。