根据你这份日志,可以把 414 秒(约 6.9 分钟) 的耗时拆清楚如下。
总览(asm2do_summary)
| 阶段 | 累计 ms | 占比(相对 asm2do 399.6s) |
|---|---|---|
| 关闭 CloseDoc | 211,738 | 53% |
| 回调 action(K检查+折弯修正+展开导出) | 170,187 | 43% |
| 打开 OpenDoc | 1,014 | <1% |
| 分类 | 50 | 可忽略 |
| 合计 asm2do | 399,640 | |
| 会话总耗时 | 414,088 | 含前后开销 |
队列 42 件 :钣金处理 22 ,跳过 20(非钣金/管件等)。
1. 最大瓶颈:每件关闭约 5 秒
close_ms 几乎稳定在 4770~5390ms,不论是否真正导出:
- 跳过的
part_skip(只打开→分类→关闭):total ≈ 5.0~5.4s,几乎全是关闭 - 已导出的
part:close ≈ 5.1~5.4s,和 action 无关
推算:42 次 CloseDoc × ~5s ≈ 210s ,与日志里的 211,738ms 一致。
也就是说:一半时间花在关文件上 ,而且非钣金件也被打开再关掉,白占 20 × 5s ≈ 100s。
2. 第二瓶颈:展开导出(export_ms)
22 件钣金里,单件 export_ms 大约 6.2~8.3s (多数 6.3~7.1s),是 action 里的主体。
典型一件):
| 步骤 | ms |
|---|---|
| K检查 | 25 |
| 折弯修正 fix_bends | 1,804 |
| 展开导出 export | 8,253 |
| 回调小计 | ~10,082 |
| 关闭 | 5,270 |
| 本件合计 | 15,637 |
fix_bends 多数在 0.4~2.5s ,个别到 2.4s ;kcheck 可忽略。
22 件 ×(export ~7s + fix ~1s)≈ 170s ,与 action_ms 总和吻合。
3. 非钣金跳过:纯浪费打开/关闭
例如 滚筒08A-1:open=358ms, category=1ms, close=4734ms → 为判「其他」花了 5.3s ,其中 89% 在关闭。
20 件跳过若用 BOM 缓存类型、不再 OpenDoc ,理论上可省约 ~100s (约 25% 总耗时)。
4. 优化优先级(按收益)
-
跳过件不要打开零件
用
asm2bom缓存里的PartType/Category(导出 BOM 时已有)判断钣金,只对「钣金件 / 钣金件展开错误」走 OpenDoc。→ 预计省 ~100s。
-
查清 CloseDoc 为何 ~5s/次
当前
partDoc.Visible = true,关文档可能触发重建/保存提示/界面刷新。可尝试:- 批量时
Visible = false - 关前
swApp.CloseDoc是否可配合swCloseDocOptions - 是否因
fix_bends改特征导致关闭时重建
→ 若关闭降到 1s,22 件钣金再省 ~80~90s。
- 批量时
-
一键导出可选跳过
fix_bends_kcheck出图状态页若只关心 DWG,折弯修正 ~0.4~2.5s/件 × 22 ≈ 10~55s。
-
export_ms(ExportToDWG + 展开重建)属 SolidWorks API,单件 6~8s 难大幅压缩;多实体件会更长。
5. 会话后半段
你贴的片段只到 asm2export 结束;若页面上还点了刷新,后面还会有 refresh_part_drawing_status(整遍 asm2bom + 展开 DWG 磁盘扫描),可能再占 1~3 分钟 ,需要看同文件里下一段 # SESSION_BEGIN operation=refresh_part_drawing_status。
结论 :当前慢,主要是 「每件关文档 ~5s」× 42 + 「每件展开导出 ~7s」× 22 ;最先值得改的是 非钣金不打开 和 缩短 CloseDoc。
如果你愿意,我可以直接改代码:用 BOM 缓存跳过非钣金的 Open/Close,并加批量时 Visible=false 试一版。