2.4 KiB
2.4 KiB
MinimalTimerExporter 增量导出框架重构计划
目标
将 BuildEventTreeForFrame() 改造为流式增量处理模式,支持大区间安全扫描,避免内存溢出。
步骤 1: 重构 IEventWriter 接口
目标:增加分段感知能力
变更:
// 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 时机
核心逻辑:
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→JsonEventWriterFExportChunker→ChunkingFileWriter
清理:
- 移除未使用的
ExportMetadataToCSV(功能重复) - 统一导出入口点