perf: 给基础体构造加计时,定位到 DrawPipe/DrawCone/DrawLoft 共占 33% #109

Merged
gjm merged 1 commits from company-desktop/company-desktop-computer/perf-primitive-counters AGit into main 2026-10-29 16:00:22 +08:00
Collaborator

继续追"剩余效率问题"。上一轮已确认 Parasolid 的 93.4% 发生在我们的视口绘制里,
本轮机位下一层:给 GiDrawUtility 的基础体构造函数加计时。

新增 inc/PerfCounterLite.h:header-only 的轻量计数器。
AecRxBase.arx 不链接 CoreLibrary(静态库只被 CoreCommand 链接),拿不到 SectionPerf
的符号,所以单独做一份;只在 Debug + AEC_PERF_COUNTER=1 时生效,Release 零开销。
统计写 %TEMP%\aec_prim_perf.txt(独立文件,避免提前写出 aec_section_perf.txt
让自动化脚本误判"开图完成")。

接入 GiDrawUtility:DrawPipe 三个重载、DrawLoft 两个重载、DrawCone、DrawCylinder。

实测(big1.dwg,93 s 开图 / 81 s CPU):
DrawPipe(region) 7201 次 13.2 s 平均 1837us 最长 130ms
DrawLoft(reg) 883 次 5.27 s 平均 5969us
DrawLoft(curve) 883 次 5.90 s 平均 6679us
DrawCone 811 次 4.64 s 平均 5717us
DrawPipe(pts)/Cylinder 2411 次 4.07 s 平均 1688us
去重后约 27 s,占 81 s CPU 的 33%。

结论(详见 perf-primitive-cost.md):

  • 7201 次管道构建 vs 约 2260 个管类实体 = 3.2 次/实体,护栏/爬梯/设备细节也在造管道
  • 单次成本差一个量级:圆柱 1.7ms 最便宜(已是优化过的快路径),圆锥 5.7ms、放样 6.0~6.7ms 最贵
  • 长尾明显:DrawPipe 最长 130ms(平均的 70 倍),存在个别大件
  • 都在"首次构建"路径上,没有重复重建,所以只能少建 / 建得更便宜 / 跨实体复用同参数几何

验证:R230 Debug 编译通过,tools/run_acad_perf.ps1 自动开图取数;
截面缓存与回写仍为正常/0(未受本次插桩影响)。

继续追"剩余效率问题"。上一轮已确认 Parasolid 的 93.4% 发生在我们的视口绘制里, 本轮机位下一层:给 GiDrawUtility 的基础体构造函数加计时。 新增 inc/PerfCounterLite.h:header-only 的轻量计数器。 AecRxBase.arx 不链接 CoreLibrary(静态库只被 CoreCommand 链接),拿不到 SectionPerf 的符号,所以单独做一份;只在 Debug + AEC_PERF_COUNTER=1 时生效,Release 零开销。 统计写 %TEMP%\aec_prim_perf.txt(独立文件,避免提前写出 aec_section_perf.txt 让自动化脚本误判"开图完成")。 接入 GiDrawUtility:DrawPipe 三个重载、DrawLoft 两个重载、DrawCone、DrawCylinder。 实测(big1.dwg,93 s 开图 / 81 s CPU): DrawPipe(region) 7201 次 13.2 s 平均 1837us 最长 130ms DrawLoft(reg) 883 次 5.27 s 平均 5969us DrawLoft(curve) 883 次 5.90 s 平均 6679us DrawCone 811 次 4.64 s 平均 5717us DrawPipe(pts)/Cylinder 2411 次 4.07 s 平均 1688us 去重后约 27 s,占 81 s CPU 的 33%。 结论(详见 perf-primitive-cost.md): - 7201 次管道构建 vs 约 2260 个管类实体 = 3.2 次/实体,护栏/爬梯/设备细节也在造管道 - 单次成本差一个量级:圆柱 1.7ms 最便宜(已是优化过的快路径),圆锥 5.7ms、放样 6.0~6.7ms 最贵 - 长尾明显:DrawPipe 最长 130ms(平均的 70 倍),存在个别大件 - 都在"首次构建"路径上,没有重复重建,所以只能少建 / 建得更便宜 / 跨实体复用同参数几何 验证:R230 Debug 编译通过,tools/run_acad_perf.ps1 自动开图取数; 截面缓存与回写仍为正常/0(未受本次插桩影响)。
company-desktop added 1 commit 2026-10-28 23:32:23 +08:00
继续追"剩余效率问题"。上一轮已确认 Parasolid 的 93.4% 发生在我们的视口绘制里,
本轮机位下一层:给 GiDrawUtility 的基础体构造函数加计时。

新增 inc/PerfCounterLite.h:header-only 的轻量计数器。
AecRxBase.arx 不链接 CoreLibrary(静态库只被 CoreCommand 链接),拿不到 SectionPerf
的符号,所以单独做一份;只在 Debug + AEC_PERF_COUNTER=1 时生效,Release 零开销。
统计写 %TEMP%\aec_prim_perf.txt(独立文件,避免提前写出 aec_section_perf.txt
让自动化脚本误判"开图完成")。

接入 GiDrawUtility:DrawPipe 三个重载、DrawLoft 两个重载、DrawCone、DrawCylinder。

实测(big1.dwg,93 s 开图 / 81 s CPU):
  DrawPipe(region)      7201 次  13.2 s  平均 1837us  最长 130ms
  DrawLoft(reg)          883 次  5.27 s  平均 5969us
  DrawLoft(curve)        883 次  5.90 s  平均 6679us
  DrawCone               811 次  4.64 s  平均 5717us
  DrawPipe(pts)/Cylinder 2411 次  4.07 s  平均 1688us
去重后约 27 s,占 81 s CPU 的 33%。

结论(详见 perf-primitive-cost.md):
- 7201 次管道构建 vs 约 2260 个管类实体 = 3.2 次/实体,护栏/爬梯/设备细节也在造管道
- 单次成本差一个量级:圆柱 1.7ms 最便宜(已是优化过的快路径),圆锥 5.7ms、放样 6.0~6.7ms 最贵
- 长尾明显:DrawPipe 最长 130ms(平均的 70 倍),存在个别大件
- 都在"首次构建"路径上,没有重复重建,所以只能少建 / 建得更便宜 / 跨实体复用同参数几何

验证:R230 Debug 编译通过,tools/run_acad_perf.ps1 自动开图取数;
截面缓存与回写仍为正常/0(未受本次插桩影响)。
gjm merged commit 17e77b448d into main 2026-10-29 16:00:22 +08:00
Sign in to join this conversation.
No Reviewers
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: gjm/envi-code#109