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:
commit
dffee29702
3 files changed
+60
-10
No files matched your search
@@ -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);
|
||||
|
||||
@@ -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 之后残余落盘只剩"每个唯一截面一次",收益小;但如果现场仍被杀软拖慢,可做这一步:
|
||||
|
||||
Reference in new issue
Block a user