b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

osip_osip解析_sip 200ok包(3)

电脑杂谈  发布时间:2017-04-01 15:05:52  来源:网络整理

osip_timers_xxx_ execute()。

经过测试,以上改动性能提升非常显著,之前未经优化,osip_timers_xxx_ execute()执行事件是优化过的osip_xxx_execute()的1.5倍,优化后变为了1/10。

需要大家注意的是,在之后的压力测试中发现了之前提到过的信号量的问题。之前在将事务加入到活动列表时(__osip_transaction_add_event())之前加了互斥,但是发现协议栈一运行就阻塞,然后就取消了互斥,但是呢,压力测试一段时间后协议栈就crash了,呵呵:)最后总算发现了调用该函数的某些时候加了互斥(比如定时器超时事件),某些时候又没有加互斥,头疼~~~没办法,只好做了该函数的两个版本!

经过上面的优化后,在相同的测试压力下,协议栈整体性能提升了一倍,并且消除了大部分的导致性能非线性下降的因素。

1.4 Call资源的释放

经过对协议栈的深入分析和测试,发现释放call资源(遍历所有的call)的函数(主要时eXosip_release_terminated_calls)调用过于频繁,也是每个事件都会触发一次。考虑到资源的释放不用那么及时,通常是在某个定时器超时后才需要释放,于是考虑让资源成批释放,启动一秒级的周期定时器来执行call资源的释放,具体多少秒执行一次,大家可以调整定时器的长度,我设的是5秒。

由于最终释放事务(eXosip.j_transactions)的资源时,该列表可能会比较长,因此将列表的遍历改为迭代器遍历,因为通过协议栈的osip_list_get()函数遍历链表的效率较低。

这项优化工作量算是很小的了,但是对性能的提升却非常实惠,经测试整体性能继续提高了一倍。至此,协议栈的性能比未经优化时已提升了4倍。osip

当然,这里也可以模仿定时器的优化一样只对超时了的事务进行资源释放,但我考虑这样修改好像比较麻烦,最终放弃了。有高手可以在这个函数上继续做文章,对协议栈的优化应该很有帮助。

5 Transaction的移除

事务的移除(只是从osip协议栈中移除,但仍被TU(eXosip)使用)对事务列表进行了遍历。由于osip的列表不能直接删除中间某个节点,原有的list iterator又不方便读取(主要不方便取得list的最后一个元素的迭代器,需要遍历list),因此实现一新的双向list替换协议栈原有list,并增加接口osip_list_get_last()直接获得链表尾的迭代器。

在事务的结构体里增加一迭代器成员,用于储存该事务在事务列表中的位置信息以便移除事务时可以直接通过迭代器来移除而不用遍历整个事务列表。

这里需要注意,为了保险起见,在hash里删除事务失败(找不到)后,我仍然轮询了事务列表,后来测试时发现函数__osip_remove_xxx_transaction()可能会被重复调用导致第二次调用时hash删除失败对事务列表进行了遍历!

其他的优化:

6 消息到字符串的转换

这部分代码存在比较多的内存拷贝和sprintf函数的调用,由于这个函数调用频繁,所以有必要对其进行优化。由于sprintf函数性能低下,因此将其通通更改为memcpy,但是这样做需要对sprintf函数输出的内容进行拆分重组。另外去除内存copy时,需要对大部分的消息内的结构体转字符串的函数重写一个版本。因此这项操作耗费了比较多的时间,也可能出错,需要经过比较详细的测试。

修改后,这部分代码的性能提升了将近一半,同sendto函数耗费时间差不多,加上消息日志的打印,发送消息的函数性能提升空间已经不大了。这项优化感觉性价比比较低,不感兴趣的同学可以不用去管它


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/tongxinshuyu/article-38863-3.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    热点图片
    拼命载入中...