live555库的性能思考粗略(一)

来源:互联网 发布:淘宝被限制登录 编辑:程序博客网 时间:2024/06/08 09:47
 

      这段时间总是在思考流媒体服务器的性能方面的问题,对DarwinStreamingServer有些初步的了解,但是对于不需要重型流媒体服务器的地方,live555库就能满足一些简单的需求,但是它的性能还有有很大的提高空间。

     对于live555的性能方面的思考,分以下几个方面进行一些简单的解析。

其一:定时器的性能提高?

     记得以前做流媒体服务器的时候,曾得到同事的建议,使用多媒体定时器,定是精度有一定保证,回调由系统自动调用,有一定的方便性。但是多媒体定时器的回调函数在外部锁的处理上容易造成死锁,这点在创建和销毁多媒体定时器的时候很容易发生。当然,如果外部锁不多,也是好处理的。不过,多媒体定时器的精度还是不够的,使用

QueryPerformanceFrequency和QueryPerformanceCounter函数可以获得高精度时间值,但是面临的问题就是需要自己管理回调处理函数,live555就是这么做的,它使用一个队列来处理定时回调处理函数,但是性能上有改善的地方。

     Live555的定时回调处理函数,每次都会注册new一个AlarmHandler类,回调处理后就delete该类,改善性能的方法就是事先生成一个AlarmHandler类的队列,使用的时候获取,使用完就回收。

 

其二:Sleep的准确性的校正?

        通常我们会直接使用Sleep函数,但是这个函数的精度只有30毫秒, 是不利于准确Sleep。Live555的Sleep采用的是Select()函数,当无任何的socket就是类似的sleep函数,它的理论精度是微秒级别,实际的效果没有详细确认,但是比对直接的Sleep函数要好。这点上,Live555使用的还是不错的,但是只是在毫秒级别上select是一个好的选择,如果要真正达到微秒的Sleep效果,还是要使用QueryPerformanceFrequency

和QueryPerformanceCounter,但是又达不到完全Sleep的效果了,这点上是一个两难的选择。

 

其三:读取IO性能的改善?

     Live555读取IO实际上没有做相应的优化,在这点上,有很多地方可以改善,但是要真正改善,我建议还是完全另辟途径,做一个缓冲层来托管读取IO的读取。具体的途径就是设计一个协议类来抽象文件,网络读取的区别,然后使用共同的缓冲类来优化读取IO的性能。这点说的比较抽象,应为具体的工作,比较复杂,所以方法清楚,具体的实施可以殊途同归。

 

其四:多线程的选择?

    Live555是只支持单线程的,但是这不妨碍我们选择多线程的方式来使用它,生成多个调度器就可以生成多个线程了。但是想在调度器内部使用多线程,改造工作很大,不建议采用。

       以上就是自己对live555性能的一些粗略思考,希望我抛砖引玉,大家多交流交流。

原创粉丝点击