按 pipe-section-region-performance-plan.md 的 Phase 0 落地。目的不是提速,而是先拿到
三个决定性数字,再判断截面缓存(Phase 1)到底值不值得做:
1) 每次截面恢复多贵(µs),一次开图共多少次;
2) 同一份 SAT 文本被重复恢复多少次(唯一 hash 数 / 模拟命中率)——直接决定缓存收益上限;
3) 临时文件写入次数与字节数(杀软扫描影响面),以及打开图纸时的回写次数。
改动:
- 新增 inc/SectionPerfCounter.h + CoreLibrary/SectionPerfCounter.cpp
- Scope(QPC 计时)+ NoteRegionText(FNV-1a 64 位 hash,统计唯一数与模拟命中)
+ NoteTempFile + NoteWriteBack + Dump/Reset
- 计数器实例放在函数内 static:CoreLibrary 是静态库且只被 CoreCommand 链接,
所以 CoreCommand.arx 里只有一份,两个入口共用
- AecDbEwPipeBase.cpp:RegionAcisInDwgInFields / RegionAcisoutDwgOutFields 接入
- CoreTools.cpp:StringToRegion 两个重载 / RegionToString 接入
- EarthWorm.cpp:注册 ENVIPERFDUMP / ENVIPERFRESET(仅 Debug)
- CoreLibrary/cmakelists.txt 加一个源文件
- 计划文档的 Phase 0 补上实际命令与采集项
开关:启动 CAD 前 set AEC_PERF_COUNTER=1;命令 ENVIPERFDUMP 打印并追加到
%TEMP%\aec_section_perf.txt,ENVIPERFRESET 清零。
Release 下 Enabled() 恒为 false,调用点只剩一次 bool 判断。
不改任何几何逻辑与存盘格式。
验证:R230 Debug 编译通过(CoreLibrary_BAL_REMOTE、CoreCommand_BAL_REMOTE,无新增 warning),
产物已自动部署到 c:\ShangHuaSoft\Envi3D-2026-M\R230\。
R190 未在本机编译(缺 v100 工具集);代码刻意只用 C++98 特性,控制台输出改走 %hs,
避开了 &wstring[0] 这类老 STL 上的写法问题。
尚未做 CAD 实测:需要开图后跑 ENVIPERFDUMP 才看得到数据。
62 lines
1.9 KiB
C++
62 lines
1.9 KiB
C++
// SectionPerfCounter.h —— Phase 0 计数器:截面(Region)恢复路径的实测探针
|
||
//
|
||
// 目的(见 pipe-section-region-performance-plan.md 的 Phase 0):
|
||
// 1. 每次截面恢复到底多贵(µs),一次开图总共多少次、多少时间;
|
||
// 2. 同一份 SAT 文本被重复恢复多少次(唯一 hash 数、模拟命中率)——
|
||
// 这个数字直接决定 Phase 1 截面缓存能省多少;
|
||
// 3. 临时文件写入次数与累计字节(杀软扫描影响面);
|
||
// 4. 放回写(RegionToString / RegionAcisoutDwgOutFields)的次数。
|
||
//
|
||
// 使用方式:
|
||
// set AEC_PERF_COUNTER=1 必须在启动 CAD 前设好(进程内只读一次)
|
||
// ENVIPERFDUMP 在 CAD 命令行打印汇总,同时追加到 %TEMP%\aec_section_perf.txt
|
||
// ENVIPERFRESET 清零
|
||
//
|
||
// 只在 _DEBUG 下生效:Release 里 Enabled() 恒为 false,调用点只剩一次 bool 判断。
|
||
// 不改变任何几何逻辑与存盘格式。
|
||
|
||
#ifndef SECTION_PERF_COUNTER_H
|
||
#define SECTION_PERF_COUNTER_H
|
||
|
||
#include <stddef.h>
|
||
|
||
namespace SectionPerf
|
||
{
|
||
// 环境变量 AEC_PERF_COUNTER 是否开启,且当前是 Debug 构建
|
||
bool Enabled();
|
||
|
||
// 计时作用域:函数入口构造,离开时累加耗时与次数
|
||
class Scope
|
||
{
|
||
public:
|
||
explicit Scope(const char* pszTag);
|
||
~Scope();
|
||
|
||
private:
|
||
Scope(const Scope&);
|
||
Scope& operator=(const Scope&);
|
||
|
||
const char* m_pszTag;
|
||
long long m_nStart;
|
||
bool m_bActive;
|
||
};
|
||
|
||
// 记录一次"待恢复的 SAT 文本":内部按内容算 64 位 hash,
|
||
// 统计唯一 hash 数与被重复命中的次数(模拟命中率)
|
||
void NoteRegionText(const char* pszTxt, size_t nLen);
|
||
|
||
// 记录一次临时文件写入
|
||
void NoteTempFile(size_t nBytes);
|
||
|
||
// 记录一次回写(Region -> SAT 文本)
|
||
void NoteWriteBack(const char* pszTag);
|
||
|
||
// 打印 + 写文件
|
||
void Dump();
|
||
|
||
// 清零
|
||
void Reset();
|
||
}
|
||
|
||
#endif // SECTION_PERF_COUNTER_H
|