Merge pull request 'diag: 拆分"写临时文件"与"acisIn"计时,判定内存读取不值得做' (#105) from company-desktop/company-desktop-computer/diag-inmemory-verdict into main

Reviewed-on: #105
Reviewed-by: gjm <littleoldpan@163.com>
This commit was merged in pull request #105.
This commit is contained in:
gjm committed 2026-10-28 22:11:34 +08:00
commit dffee29702
3 files changed
+60 -10

No files matched your search

+25 -7
View File
@@ -3564,8 +3564,11 @@ AcDbRegion* CoreTools::StringToRegion(const CString & sRegionScrp)
if (file.Open(sFullPath, CFile::modeCreate | CFile::modeWrite))
{
file.Write(sNewSrc.c_str(), sizeof(char) * (UINT)sNewSrc.size());
file.Close();
{
SectionPerf::Scope w("Str2Reg.write");
file.Write(sNewSrc.c_str(), sizeof(char) * (UINT)sNewSrc.size());
file.Close();
}
SectionPerf::NoteTempFile(sNewSrc.size());
}
else
@@ -3577,7 +3580,11 @@ AcDbRegion* CoreTools::StringToRegion(const CString & sRegionScrp)
AcDbRegion *pReg(NULL);
AcDbVoidPtrArray arBodyPtrs;
Acad::ErrorStatus es(AcDbBody::acisIn(sFullPath, arBodyPtrs));
Acad::ErrorStatus es(Acad::eOk);
{
SectionPerf::Scope r("Str2Reg.acisIn");
es = AcDbBody::acisIn(sFullPath, arBodyPtrs);
}
if (Acad::eOk == es)
{
if (arBodyPtrs.length() > 0)
@@ -3646,8 +3653,11 @@ AcDbRegion *CoreTools::StringToRegion(Adesk::UInt64 nLen, char *pszReg)
CFile file;
if (file.Open(sFullPath, CFile::modeCreate | CFile::modeWrite))
{
file.Write(sNewSrc.c_str(), sizeof(char) * (UINT)sNewSrc.size());
file.Close();
{
SectionPerf::Scope w("Str2Reg.write");
file.Write(sNewSrc.c_str(), sizeof(char) * (UINT)sNewSrc.size());
file.Close();
}
SectionPerf::NoteTempFile(sNewSrc.size());
}
else
@@ -3658,7 +3668,11 @@ AcDbRegion *CoreTools::StringToRegion(Adesk::UInt64 nLen, char *pszReg)
}
AcDbVoidPtrArray arBodyPtrs;
Acad::ErrorStatus es(AcDbBody::acisIn(sFullPath, arBodyPtrs));
Acad::ErrorStatus es(Acad::eOk);
{
SectionPerf::Scope r("Str2Reg.acisIn");
es = AcDbBody::acisIn(sFullPath, arBodyPtrs);
}
if (Acad::eOk == es)
{
if (arBodyPtrs.length() > 0)
@@ -3760,7 +3774,11 @@ AcDbSurface *CoreTools::StringToFace(Adesk::UInt64 nLen, char *pszBody)
}
AcDbVoidPtrArray arBodyPtrs;
Acad::ErrorStatus es(AcDbBody::acisIn(sFullPath, arBodyPtrs));
Acad::ErrorStatus es(Acad::eOk);
{
SectionPerf::Scope r("Str2Reg.acisIn");
es = AcDbBody::acisIn(sFullPath, arBodyPtrs);
}
if (Acad::eOk == es)
{
if (arBodyPtrs.length() > 0)
@@ -921,15 +921,22 @@ AcDbRegion* AecDbEwPipeBase::RegionAcisInDwgInFields(AcDbDwgFiler* pFiler)
return NULL;
}
file.Write(pszTxt,nLen);
file.Close();
{
SectionPerf::Scope w("RegIn.write");
file.Write(pszTxt,nLen);
file.Close();
}
delete[] pszTxt;
// 读侧落盘的临时文件次数/字节(杀软扫描影响面)
SectionPerf::NoteTempFile((size_t)nLen);
AcDbVoidPtrArray arBodyPtrs;
Acad::ErrorStatus es = AcDbBody::acisIn(sFullPath,arBodyPtrs);
Acad::ErrorStatus es = Acad::eOk;
{
SectionPerf::Scope r("RegIn.acisIn");
es = AcDbBody::acisIn(sFullPath,arBodyPtrs);
}
if (es != Acad::eOk)
{
acutPrintf(_T("\nAecDbEwPipeBase: 截面 acisIn 失败,len=%u,err=%d。"),nLen,es);
+25
View File
@@ -414,6 +414,31 @@ pClone->dwgIn(&filer); // → dwgInFields → acisIn 读回来
`ToJson()` 靠 `BuildSectionFromXData()` 重建,需要实际触发一次导出,
确认 `__pipes__` 里每条仍有 `__section__` / `__section2__` 且数值与改动前一致。
### 是否改用"内存读取"?——实测后决定不做
修完回写之后,开图期仍有 **1733 次临时文件写入**(2.34 MB),自然会想:
如果 `acisIn` 能从内存读,不就省掉 I/O 和杀软扫描了吗?
把"写文件"和"acisIn"分开计时后(`RegIn.write` / `RegIn.acisIn` / `Str2Reg.write` / `Str2Reg.acisIn`):
| 环节 | 次数 | 总耗时 | 平均 |
| --- | ---: | ---: | ---: |
| `RegIn.write`(实体路径,写+关闭,含杀软扫描) | 374 | **70.5 ms** | 189 µs |
| `RegIn.acisIn` | 374 | 1422 ms | 3.80 ms |
| `Str2Reg.write` | 1359 | **267.7 ms** | 197 µs |
| `Str2Reg.acisIn` | 1359 | 5999 ms | 4.41 ms |
**写文件合计只有 338 ms,占 9.6 s 恢复耗时的 3.5%**,其余 7.4 s 是 `acisIn` 解析文本本身。
杀软扫描的时间已经包含在 `write` 的 190 µs 里(Defender 在关闭时扫),不是额外开销。
结论:即使完全省掉文件往返,最多省 0.3~0.5 s(开图的 0.4%)——**不值得做**。
而且 `AcDbBody::acisIn` 在 R19~R26 只有文件名重载,真要"内存解析"只能改存盘格式
走 `acdbModelerRestoreEntityFromDwgFiler`(即此前评估后暂缓的 Phase 3)。
剩下的 7.4 s = 1733 次 × 4.3 ms 的纯解析,只能靠减少解析次数,
而 text 通道的 1560 个唯一文本是**真实不同的截面**,命中率已接近上限。
继续提速应转向 Parasolid 绘制那条线(早先 trace 里独占约 43%),不是截面恢复。
### Phase 2:临时目录治理(可选,止血)
Phase 1 之后残余落盘只剩"每个唯一截面一次",收益小;但如果现场仍被杀软拖慢,可做这一步: