Ookla speedtest网速测试算法实现

参考speedtest.net (ookla)的文档

https://help.speedtest.net/hc/en-us/articles/360038679354-How-does-Speedtest-measure-my-network-speeds-

还有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;
}

猜你喜欢

转载自blog.csdn.net/MengXP/article/details/109631314