91 lines
2.4 KiB
Markdown
91 lines
2.4 KiB
Markdown
|
|
## MinimalTimerExporter 增量导出框架重构计划
|
|||
|
|
|
|||
|
|
### 目标
|
|||
|
|
将 `BuildEventTreeForFrame()` 改造为**流式增量处理模式**,支持大区间安全扫描,避免内存溢出。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 步骤 1: 重构 IEventWriter 接口
|
|||
|
|
|
|||
|
|
**目标**:增加分段感知能力
|
|||
|
|
|
|||
|
|
**变更**:
|
|||
|
|
```cpp
|
|||
|
|
// IEventWriter 新增方法
|
|||
|
|
virtual void BeginLogicalChunk(int32 ChunkIndex) = 0;
|
|||
|
|
virtual void EndLogicalChunk(int32 ChunkIndex) = 0;
|
|||
|
|
virtual void Flush() = 0;
|
|||
|
|
virtual bool WantsStructuredPath() const { return false; }
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**新增**:
|
|||
|
|
- `FStructuredEventData` 结构体,用于传递树形事件数据
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 步骤 2: 重构 BuildEventTreeForFrame
|
|||
|
|
|
|||
|
|
**目标**:增量流式处理,内部判断 flush 时机
|
|||
|
|
|
|||
|
|
**核心逻辑**:
|
|||
|
|
```cpp
|
|||
|
|
void BuildEventTreeForFrame(
|
|||
|
|
const Trace::ITimingProfilerProvider::Timeline& Timeline,
|
|||
|
|
const Trace::ITimingProfilerTimerReader* TimerReader,
|
|||
|
|
double StartTime,
|
|||
|
|
double EndTime,
|
|||
|
|
IEventWriter& Writer, // 改为接口依赖
|
|||
|
|
int32 EventsPerChunk = 10000) // 可配置的 flush 阈值
|
|||
|
|
{
|
|||
|
|
// 1. Writer.BeginLogicalChunk(0)
|
|||
|
|
// 2. 迭代 EnumerateEvents
|
|||
|
|
// 3. 内部维护 Stack 构建树
|
|||
|
|
// 4. 当处理事件数 >= EventsPerChunk 时:
|
|||
|
|
// - Writer.EndLogicalChunk(chunkIndex)
|
|||
|
|
// - Writer.Flush()
|
|||
|
|
// - 清空 Stack,chunkIndex++
|
|||
|
|
// - Writer.BeginLogicalChunk(chunkIndex)
|
|||
|
|
// 5. 结束时 Writer.EndLogicalChunk()
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 步骤 3: 重构 FJsonEventWriter
|
|||
|
|
|
|||
|
|
**适配新的 Writer 接口**:
|
|||
|
|
- 实现 `BeginLogicalChunk()` / `EndLogicalChunk()`
|
|||
|
|
- 支持 JSON 数组内的分段标记
|
|||
|
|
- 确保每个 chunk 都是自洽的 JSON
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 步骤 4: 保持 FCsvEventWriter 兼容
|
|||
|
|
|
|||
|
|
- 实现新的接口方法(空实现或基本转发)
|
|||
|
|
- 保持原有 CSV 格式兼容
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 步骤 5: 重构 RunExport
|
|||
|
|
|
|||
|
|
**目标**:统一调度入口
|
|||
|
|
|
|||
|
|
**变更**:
|
|||
|
|
- 引入 `ExportCoordinator` 类(如果需要)
|
|||
|
|
- 或者增强现有 `RunExport()` 函数
|
|||
|
|
- 支持传入 `WantsStructuredPath()` 判断
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 步骤 6: 清理与重构
|
|||
|
|
|
|||
|
|
**重命名建议**:
|
|||
|
|
- `BuildEventTreeForFrame` → `StreamEventsWithTreeBuilding`(更准确描述行为)
|
|||
|
|
- `FCsvEventWriter` → `CsvEventWriter`(去掉无意义的 F 前缀)
|
|||
|
|
- `FJsonEventWriter` → `JsonEventWriter`
|
|||
|
|
- `FExportChunker` → `ChunkingFileWriter`
|
|||
|
|
|
|||
|
|
**清理**:
|
|||
|
|
- 移除未使用的 `ExportMetadataToCSV`(功能重复)
|
|||
|
|
- 统一导出入口点
|