【发布时间】:2011-11-04 20:25:36
【问题描述】:
我最近的任务是实现一个缓冲区,该缓冲区将被日志类用作临时存储。日志记录类本身是一个单例,并且使用了观察者侦听器模式。您可以期望使用此类记录数以千计的消息。
现在问题出在这里:
我们有一个用于调试目的的跟踪日志记录选项。启用此选项后,每秒消息数会以指数方式增加。在发布代码中,跟踪记录被禁用,但是可以存储固定数量的消息的缓冲区,例如10000 被转储到日志中如果发生错误,以便开发人员找出问题的根源。
如果缓冲区已满,则删除最旧的消息,以便为最新消息释放空间。
void Log::storeToBuffer(const LogType_E & type_in, const LogDomain_E & domain_in,const int & id_in, const char * msg_in)
{
if(this->myEnableTraceBuffer)
{
if(static_cast<std::list<Message> * >(this->myRingBuffer)->size() < this->myRingBufferMaxSize)
{
static_cast<std::list<Message> * >(this->myRingBuffer)->push_back(Message(type_in, domain_in, id_in, msg_in));
}
else
{
//buffer full so remove oldest element and add new
if(static_cast<std::list<Message> * >(this->myRingBuffer)->size() > 0) static_cast<std::list<Message> * >(this->myRingBuffer)->pop_front();
static_cast<std::list<Message> * >(this->myRingBuffer)->push_back(Message(type_in, domain_in, id_in, msg_in));
}
}
}
我使用 std::list 实现了这一点,非常简单地使用 push_back/pop_front 来利用恒定的删除/插入执行时间。 (不要要求空投,不是我的决定)。
但是由于缓冲区大小是固定的,并且在对象的生命周期内不太可能改变,也许带有显式索引操作的向量更合适?例如,可以有两个 indeces , start/current 都从位置 0 开始。当向量已满时,我们添加一些东西 start 移动到位置 1 和 current 到位置 0,因此在打印结果时我们有正确的顺序。
也许另一个 STL 容器更适合这种东西?
感谢您耐心阅读这长长的文字墙。我在这里回答任何问题。
【问题讨论】:
-
这实际上是 FIFO 而不是 FILO/LIFO。
-
@ChristianRau 是的,你完全正确。
-
只是好奇,你为什么要把日志保存在内存中?如果发生崩溃,您的日志会在您最需要的时候消失。
-
@AndersK。我们只是将跟踪消息保存在内存中,而不是日志本身。当您有数百万条消息时,它会严重影响性能,因此跟踪消息仅用于调试目的。
-
是的,感谢您提供的信息,祝您愉快。
标签: c++ stl containers