19 自己初始化Timer_Queue的尺寸
如果你的应用有大量的定时器,你最好自己控制Timer_Queue的尺寸。原因如下。默认的ACE的Timer_Queue初始化的尺寸不大,一般只有44个。而原有的尺寸不能满足你的要求的时候,Timer_Queue会自动增长,以Timer_Heap为例,增长的方式是扩大一倍空间。在性能要求严格环境下,多次增长队列的尺寸对性能会造成一定的冲击。下面是空间调整函数grow_heap的部分代码剖析。
template <class TYPE, class FUNCTOR, class ACE_LOCK> void
ACE_Timer_Heap_T<TYPE, FUNCTOR, ACE_LOCK>::grow_heap (void)
{
//调整为最大尺寸的两倍
size_t new_size = this->max_size_ * 2;
ACE_Timer_Node_T<TYPE> **new_heap = 0;
//NEW新的空间,将原有的空间的数据拷贝回来。
ACE_NEW (new_heap,
ACE_Timer_Node_T<TYPE> *[new_size]);
ACE_OS::memcpy (new_heap,
this->heap_,
this->max_size_ * sizeof *new_heap);
delete [] this->heap_;
this->heap_ = new_heap;
//后面还有多个空间要扩展和调整
……
this->max_size_ = new_size;
}
其实这和std::vector一样,如果你知道要使用多少空间,先调用reserve预分配空间会大大加快后面的执行速度。如果你知道要使用多少个定时器,告知底层,它会帮你提前分配好空间,否则他会采用他认为合理的方式和尺寸。
所以最好的方法是你先估算你大致需要使用的Timer数量,在初始化是告诉Timer_Queue。但是Reactor没有办法通过使用参数调整Time_Queue的大小,你必须自己进行替换Time_Queue来实现目的。方法大致如下:
ACE_Timer_Queue *timer_queue_=NULL;
//根据自己的需要调整Time_Queue的尺寸
timer_queue_ = new ACE_Timer_Heap(maxaccept + maxconnect + 16);
ACE_Reactor::instance(new ACE_Reactor(new ACE_Select_Reactor(NULL,timer_queue_,1),1),1);
这样你就替换了Reactor的Timer_Queue,同时你要记住在程序运行退出前自己释放的你申请的timer_queue_;