在项目开发中,经常会需要一个计速器或限速器,尤其是网络方面,需要计算当前码率或者限制码率大小。在webrtc中就有很多网络策略值得借鉴,今天从webrtc源码中学习毫秒级计速器。
先看下一些RateStatistics成员变量:
Bucket中的samples表示采样次数,sum表示采样值总和。每一毫秒一个Bucket,创建“滑动窗口”,循环利用,大小为max_window_size。通过accumulated_count_、oldest_time_和scale_可计算出某一时刻的速率;oldest_time、oldest_index_和buckets_用户删除过时的记录。
接下来看下函数,主要就是三个Update,Rate,EraseOld。Update函数用于更新指定时刻的采样值:
首先删除过时的记录,因为buckets_是循环利用的,如果不删除过时的记录,新记录会在过时的老记录上进行叠加,这显然是不正确的。通过now_ms、oldest_time_和oldest_index_计算出存储位置index值,然后累加buckets_[index]和accumulated_count_等。
Rate函数获取指定时刻的速率:
首先还是删除过时的记录,不然计算出来不是最新窗口的速率,导致存在误差。接着是临界情况的判断,然后计算速率,上面代码用这个公式:rate = accumulated_count_ / active_window_size * scale_表达,可能更容易理解。这是个通用计速器,scale不同,可以演化出不同的计速器;以统计码率为例,那么Update函数以当前毫秒数和字节数为参数,而scale_应该等于8000。因为accumulated_count_ / active_window_size表示每毫秒传输的字节数,通过scale_转换为bps单位。
EraseOld函数删除过时的记录:
这里就是一个循环,对于过时记录,重新初始化bucket,更新accumulated_count_和num_samples_。循环条件里面增加num_samples_>0,可以提升一些效率。
整体逻辑比较简单,对外接口就是更新采样值,获取速率两个。注意点就是一些临界判断,比如什么时候才能获取可用的速率等。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。