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