From bf98c4007f1d1de4580e2f2e92f080ccaced4795 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Fri, 29 May 2026 10:37:00 +0800 Subject: [PATCH] Use configurable page size and delay in speedtests https://github.com/2dust/v2rayN/pull/9392 --- .../ServiceLib/Models/Configs/ConfigItems.cs | 2 + .../ServiceLib/Services/SpeedtestService.cs | 49 +++++++++++-------- 2 files changed, 31 insertions(+), 20 deletions(-) diff --git a/v2rayN/ServiceLib/Models/Configs/ConfigItems.cs b/v2rayN/ServiceLib/Models/Configs/ConfigItems.cs index e9e7f5f8..d5101275 100644 --- a/v2rayN/ServiceLib/Models/Configs/ConfigItems.cs +++ b/v2rayN/ServiceLib/Models/Configs/ConfigItems.cs @@ -159,6 +159,8 @@ public class SpeedTestItem public int MixedConcurrencyCount { get; set; } public string IPAPIUrl { get; set; } public string UdpTestTarget { get; set; } + public int? SpeedTestPageSize { get; set; } + public int? SpeedTestDelayInterval { get; set; } } [Serializable] diff --git a/v2rayN/ServiceLib/Services/SpeedtestService.cs b/v2rayN/ServiceLib/Services/SpeedtestService.cs index 08258160..11778b22 100644 --- a/v2rayN/ServiceLib/Services/SpeedtestService.cs +++ b/v2rayN/ServiceLib/Services/SpeedtestService.cs @@ -8,6 +8,8 @@ public class SpeedtestService(Config config, Func updateF private readonly Config? _config = config; private readonly Func? _updateFunc = updateFunc; private static readonly ConcurrentBag _lstExitLoop = new(); + private readonly int _speedTestPageSize = config.SpeedTestItem.SpeedTestPageSize ?? Global.SpeedTestPageSize; + private readonly TimeSpan _delayInterval = TimeSpan.FromSeconds(config.SpeedTestItem.SpeedTestDelayInterval ?? 1); public void RunLoop(ESpeedActionType actionType, List selecteds) { @@ -135,32 +137,39 @@ public class SpeedtestService(Config config, Func updateF private async Task RunTcpingAsync(List selecteds) { - List tasks = []; - foreach (var it in selecteds) - { - tasks.Add(Task.Run(async () => - { - try - { - var responseTime = await GetTcpingTime(it.Address, it.Port); + var pageSize = Math.Min(selecteds.Count, _speedTestPageSize); + var lstBatch = GetTestBatchItem(selecteds, pageSize); - ProfileExManager.Instance.SetTestDelay(it.IndexId, responseTime); - await UpdateFunc(it.IndexId, responseTime.ToString()); - } - catch (Exception ex) + foreach (var lst in lstBatch) + { + List tasks = []; + foreach (var it in lst) + { + tasks.Add(Task.Run(async () => { - Logging.SaveLog(_tag, ex); - } - })); + try + { + var responseTime = await GetTcpingTime(it.Address, it.Port); + + ProfileExManager.Instance.SetTestDelay(it.IndexId, responseTime); + await UpdateFunc(it.IndexId, responseTime.ToString()); + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + } + })); + } + await Task.WhenAll(tasks); + await Task.Delay(_delayInterval); } - await Task.WhenAll(tasks); } private async Task RunRealPingBatchAsync(List lstSelected, string exitLoopKey, int pageSize = 0) { if (pageSize <= 0) { - pageSize = lstSelected.Count < Global.SpeedTestPageSize ? lstSelected.Count : Global.SpeedTestPageSize; + pageSize = Math.Min(lstSelected.Count, _speedTestPageSize); } var lstTest = GetTestBatchItem(lstSelected, pageSize); @@ -172,7 +181,7 @@ public class SpeedtestService(Config config, Func updateF { lstFailed.AddRange(lst); } - await Task.Delay(100); + await Task.Delay(_delayInterval); } //Retest the failed part @@ -249,7 +258,7 @@ public class SpeedtestService(Config config, Func updateF { if (pageSize <= 0) { - pageSize = lstSelected.Count < Global.SpeedTestPageSize ? lstSelected.Count : Global.SpeedTestPageSize; + pageSize = Math.Min(lstSelected.Count, _speedTestPageSize); } var lstTest = GetTestBatchItem(lstSelected, pageSize); @@ -261,7 +270,7 @@ public class SpeedtestService(Config config, Func updateF { lstFailed.AddRange(lst); } - await Task.Delay(100); + await Task.Delay(_delayInterval); } //Retest the failed part