15 ACE_Time_Value的赋值效率
ACE_Time_Value是使用ACE会大量使用类。但是他的部分函数没有高效的实现。比如构造函数:
ACE_INLINE
ACE_Time_Value::ACE_Time_Value (time_t sec, suseconds_t usec)
和set函数
ACE_INLINE void
ACE_Time_Value::set (time_t sec, suseconds_t usec)
为了规范用户的赋值,在这些函数的最后都会调用normalize函数。
void ACE_Time_Value::normalize (void)
但如果你的赋值的微秒数值不合适(过大)时,normalize却不是一个高效实现。下面简单摘取normalize的一段代码。
void
ACE_Time_Value::normalize (void)
{
//如果赋值的大于微秒数值大于1s。
if (this->tv_.tv_usec >= ACE_ONE_SECOND_IN_USECS)
{
/*! /todo This loop needs some optimization. */
//作者都认为这个代码要优化
//那么进入循环,每次减去1000000的微秒单位,在秒的单位+1,上帝呀。
do
{
++this->tv_.tv_sec;
this->tv_.tv_usec -= ACE_ONE_SECOND_IN_USECS;
}
while (this->tv_.tv_usec >= ACE_ONE_SECOND_IN_USECS);
}
…………
}
很不理解为什么会写成如此的低效。为什么不直接使用除法呢,我很不理解。所以如果你在代码的主循环中如果使用了ACE_Time_Value,使用上面的那些函数就可能掉入陷阱。
解决方法是尽量使用函数sec和usec赋值,这些函数不会调用normalize,这两个函数会直接赋值。如果非要使用上面的那些函数方式,也一定不要使用过大的(错误的)时间参数。
这个问题到 5.6.1 还没有得到修正。