LoongCollector优化第二步是避免PipelineEvent中的shared_ptr,原因和实现如下:
为什么shared_ptr有性能开销:
- shared_ptr内部维护原子引用计数
- 每次Event创建时增加计数(原子操作),析构时减少计数(原子操作)
- 一个Group内可能有成百上千个Event,每个都持有SourceBuffer的shared_ptr
- 原子操作在多核环境下涉及缓存一致性协议,开销不可忽视
优化前:每个LogEvent持有shared_ptr<SourceBuffer>
优化后:改为PipelineEventGroup*普通指针
class LogEvent : public PipelineEvent {
private:
std::map<std::string_view, std::string_view> mContents;
PipelineEventGroup* mPipelineEventGroupPtr; // 替代shared_ptr
};
可行性前提:做出"一个Event一定从属于某个Group"的假定,不需要Event在Group间灵活转移的能力。通过Group指针间接访问内存池。
效果:只有Group创建/销毁时才涉及shared_ptr操作,结合Memory Arena,性能已超越iLogtail原有架构。




