自己初始化Timer_Queue的尺寸

19         自己初始化Timer_Queue的尺寸

如果你的应用有大量的定时器,你最好自己控制Timer_Queue的尺寸。原因如下。默认的ACETimer_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);

这样你就替换了ReactorTimer_Queue,同时你要记住在程序运行退出前自己释放的你申请的timer_queue_;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值