diff --git a/SourceCode/Code2026/CoreCommand/CoreTools.cpp b/SourceCode/Code2026/CoreCommand/CoreTools.cpp index 51782a9..12f780d 100644 --- a/SourceCode/Code2026/CoreCommand/CoreTools.cpp +++ b/SourceCode/Code2026/CoreCommand/CoreTools.cpp @@ -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) diff --git a/SourceCode/Code2026/CoreLibrary/AecDbEwPipeBase.cpp b/SourceCode/Code2026/CoreLibrary/AecDbEwPipeBase.cpp index d773b8e..fb8486b 100644 --- a/SourceCode/Code2026/CoreLibrary/AecDbEwPipeBase.cpp +++ b/SourceCode/Code2026/CoreLibrary/AecDbEwPipeBase.cpp @@ -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); diff --git a/pipe-section-region-performance-plan.md b/pipe-section-region-performance-plan.md index 8f8a7d1..7100400 100644 --- a/pipe-section-region-performance-plan.md +++ b/pipe-section-region-performance-plan.md @@ -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 之后残余落盘只剩"每个唯一截面一次",收益小;但如果现场仍被杀软拖慢,可做这一步: