XIU2 / CloudflareSpeedTest

🌩「自选优选 IP」测试 Cloudflare CDN 延迟和速度,获取最快 IP !当然也支持其他 CDN / 网站 IP ~
GNU General Public License v3.0
18.24k stars 3.51k forks source link

http模式下,检测到可用ip超过10就跳过后续未完成的检测延迟,直接进入下载测速阶段节省时间 #389

Open 1265578519 opened 1 year ago

1265578519 commented 1 year ago

功能需求

http模式下,检测到可用ip超过10就跳过后续未完成的检测延迟,直接进入下载测速阶段节省时间

预期目标

1

XIU2 commented 1 year ago

这个的话,我不确定是否为大众需求(就是不少人会需要的功能)。

一般什么情况下会产生该需求?请举几个例子。 毕竟一般来说,大家都是希望延迟测速所有 IP 后,排序得到延迟最低的 IP,再去下载测速或直接使用。而如果只需要 10 个可用的话,那么代表你不在乎可用 IP 的延迟/丢包,或者说你预先知道了这些可用 IP 的延迟/丢包情况都差不多,因此也不挑。

如果没什么人会用到的话,我可能会懒得去添加。。。对该功能感兴趣的其他人也可以在下面回复或给本条回复点表情,我看看有没有其他人需要该功能的。

XIU2 commented 1 year ago

正好有空,就顺便研究下,不过试了下发现似乎不好完美实现。

因为理想情况下应该为:延迟测速可用 IP 数量等于 10 时,立即终止所有延迟测速线程,停止创建新线程,再继续后续步骤。 但我发现 停止创建新线程 可以实现,而 立即终止所有延迟测速线程 有点麻烦,主要问题在于这些线程处理的都是网络链接,而非本地计算,因此并不是说终止就立即终止,实际上终止这些线程也是需要时间的,而我半吊子的 Golang 也不好解决该问题,于是干脆停止创建新线程并丢弃所有后续线程的延迟测速结果。

这是我编译出来的测试版(因为是测试,所以代码写死了 10 个):CloudflareST_beta.zip

使用时,看似延迟测速结果只有 10 个,但实际上还是测速了 200 个(取决于 -n 延迟测速线程参数,默认为 200),只不过当可用 IP 数量大于等于 10 个时,后续的 IP 延迟测速结果都被丢弃了。

不过因为是多线程操作的原因,偶尔可能会遇到最终测速结果是 11 个的问题(即时间卡的很巧)。


这种实现方法比较简单,只需要添加两处判断即可,代码修改如下:

// tcping.go

func (p *Ping) Run() utils.PingDelaySet {
    if len(p.ips) == 0 {
        return p.csv
    }
    if Httping {
        fmt.Printf("开始延迟测速(模式:HTTP,端口:%d,平均延迟上限:%v ms,平均延迟下限:%v ms)\n", TCPPort, utils.InputMaxDelay.Milliseconds(), utils.InputMinDelay.Milliseconds())
    } else {
        fmt.Printf("开始延迟测速(模式:TCP,端口:%d,平均延迟上限:%v ms,平均延迟下限:%v ms)\n", TCPPort, utils.InputMaxDelay.Milliseconds(), utils.InputMinDelay.Milliseconds())
    }
    for _, ip := range p.ips {
        // 这里加了个可用 IP 数量判断,大于等于 10 个就退出循环,不再创建新延迟测速线程(因为只是测试,所以是写死的 10 个)
        if len(p.csv) >= 10 {
            break
        }
        p.wg.Add(1)
        p.control <- false
        go p.start(ip)
    }
    p.wg.Wait()
    p.bar.Done()
    sort.Sort(p.csv)
    return p.csv
}

// ...
// ...
// ...

func (p *Ping) tcpingHandler(ip *net.IPAddr) {
    recv, totalDlay := p.checkConnection(ip)
    nowAble := len(p.csv)
    if recv != 0 {
        nowAble++
    }
    // 这里加了个判断,用于延迟测速后判断可用 IP 数量大于 10 就退出,不再新增可用 IP 数量、不再处理后续的延迟测速结果
    if nowAble > 10 {
        return
    }
    p.bar.Grow(1, strconv.Itoa(nowAble))
    if recv == 0 {
        return
    }
    data := &utils.PingData{
        IP:       ip,
        Sended:   PingTimes,
        Received: recv,
        Delay:    totalDlay / time.Duration(recv),
    }
    p.appendIPData(data)
}
1265578519 commented 1 year ago

或者说你预先知道了这些可用 IP 的延迟/丢包情况都差不多

对的,因为HTTP模式一般是配合机场代码使用,测速相同的地区,基本大差不差

这是我编译出来的测试版(因为是测试,所以代码写死了 10 个):CloudflareST_beta.zip

哇,真速度~晚上电脑后试一下

1265578519 commented 1 year ago

测试好用!我觉得现在这样已经可以满足需求,基本3秒就能从4w个ip中赛选出来10个直接开始下载测试,至少现在不会测出五千个可用ip的情况了

XIU2 commented 1 year ago

那就行,考虑到不清楚是否有其他人需要该功能,所以正式版暂不会添加该功能,你先暂时用着这个测试版吧。

t-e-s-tweb commented 10 months ago

Can an android version be made? Its very useful if someone is only using ips from some specific region. Say for example you need a Europe IP because your server is in Europe so just quickly find a working IP from that region instead of testing everything

XIU2 commented 10 months ago

@t-e-s-tweb #61 、https://github.com/xianshenglu/cloudflare-ip-tester-app