参考speedtest.net (ookla)的文档
还有github上的一个项目
https://github.com/miquels/speedtest/blob/master/doc/algorithm.md
实现了一个山寨版测速小工具,关键代码如下
void PushSample(uint32_t val)
{
int i, inPos = 0;
//降序插入,先寻找合适的插入位置
for(i = 0; i < (int)StatisCtx.SampleCount; i++)
{
if(val > StatisCtx.SampleArray[i])
{
inPos = i;
break;
}
}
//插入点数据全部后移
StatisCtx.SampleCount++;
for(i = (int)StatisCtx.SampleCount - 1; i > inPos; i--)
{
StatisCtx.SampleArray[i] = StatisCtx.SampleArray[i - 1];
}
//插入
StatisCtx.SampleArray[inPos] = val;
StatisCtx.SampleLast = val;
}
uint32_t CalcSampleAverage(void)
{
uint32_t total = StatisCtx.SampleCount; //样本总数 平均值算法来自 Ookla
uint32_t start = total * 10 / 100; //有效样本起始序号(忽略样本中最大的 10%)
uint32_t end = total * 70 / 100; //有效样本结束序号(使用样本中间的 60% ,最小的 30% 丢弃了)
uint32_t count = end - start; //有效样本的数量
uint32_t sum = 0;
//如果总样本少于 10 个,就不计算了
if(total < 10)
return -1;
while(start < end)
{
sum += StatisCtx.SampleArray[start];
start++;
}
return sum / count;
}