计算最小/最大/平均 ping 响应

本文关键字:ping 响应 平均 最大 计算 | 更新日期: 2023-09-27 18:33:45

所以这里有一个测试流行RuneScape游戏的每个服务器的应用程序。我在 139 台服务器中的每一台服务器上运行 ping 并向数组添加滞后值。在循环浏览列表条目时,我可以计算每个服务器的平均、最小和最大延迟。

现在,在我的代码中,当注意到其中一个无法访问的服务器时,最低延迟显示为 0。我不确定如何处理我的 ping 响应是否已达到超时并将 0 发布到数组列表。

当服务器关闭时,我该怎么做才能避免 0 作为我的最低 ping?

using System;
using System.Net.NetworkInformation;
using System.Collections.Generic;
namespace RuneScape_Ping_Tool
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.Write(Environment.NewLine + "Start the test? (y/n): ");
            if (Console.Read() == char.Parse("y"))
            {
                Console.WriteLine();
                Ping();
            }
        }
        static void Ping()
        {
            List<int> lag = new List<int>();
            for (int server = 1; server <= 139; server++)
            {
                string url = "world" + server.ToString() + ".runescape.com";
                Console.WriteLine("Checking world " + server + "...");
                Ping ping = new Ping();
                PingReply reply = ping.Send(url);
                lag.Add(int.Parse(reply.RoundtripTime.ToString()));
            }
            for (int i = 1; i <= 139; i++)
            {
                Console.WriteLine("World " + i + ": " + lag[i - 1]);
            }
            int average = 0;
            int highest = 1;
            int lowest = 1000;
            int highestWorld = 0;
            int lowestWorld = 0;
            for (int i = 1; i <= 139; i++)
            {
                average = average + lag[i - 1];
            }
            for (int i = 1; i <= 139; i++)
            {
                if (highest < lag[i - 1])
                {
                    highest = lag[i - 1];
                    highestWorld = i;
                }
            }
            for (int i = 1; i <= 139; i++)
            {
                if (lowest > lag[i - 1])
                {
                    lowest = lag[i - 1];
                    lowestWorld = i;
                }
            }
            Console.WriteLine();
            Console.WriteLine("Average lag: " + average / 139);
            Console.WriteLine("Highest lag: " + highest + " in world " + highestWorld);
            Console.WriteLine("Lowest lag: " + lowest + " in world " + lowestWorld);
            Console.Write(Environment.NewLine + "Start the test? (y/n): ");
            if (Console.Read() == char.Parse("y"))
            {
                Console.WriteLine();
                Ping();
            }
        }
    }
}

计算最小/最大/平均 ping 响应

你能跳过零吗?此外,您也可以将所有计算放在一个循环中。

int n = 0 // number of data points
for (int i = 0; i < 139; ++i) {
  if (lag[i] == 0) {
    continue;  // skip 0 values
  }
  ++n;
  sum += lag[i];
  if (highest < lag[i]) {
    highest = lag[i];
    highestWorld = i + 1;
  }
  if (lowest > lag[i]) {
    lowest = lag[i];
    lowestWorld = i + 1;
  }
  average = sum / n;  // Note: you may want to round this.
}

首先考虑并行运行所有内容(此处一次运行 4 个):

var servers = Enumerable.Range(1, 139).Select(i => String.Format("world{0}.runescape.com",i));
var results = servers.AsParallel()
                     .WithDegreeOfParallelism(4)
                     .Select(server => new Ping().Send(server))
                     .ToList();

然后只收集有效的结果,注意使用 PingReply.Status 而不是检查0

var validResults = results.Where(r => r.Status == IPStatus.Success)
                          .Select(r => r.RoundtripTime);

以下是您需要的信息:

Console.WriteLine("Total Results: {0}", results.Count());
Console.WriteLine("Valid Results: {0}", validResults.Count());
Console.WriteLine("Min from Valid: {0}", validResults.Min());
Console.WriteLine("Max from Valid: {0}", validResults.Max());
Console.WriteLine("Avg from Valid: {0}", validResults.Average());

您可以使用这些函数获得最小值、最大值和平均值。

var nozeros = lag.Where(i => i > 0);
int lowest = nozeros.Min();
int lowestWorld = lag.IndexOf(lowest);
int highest = nozeros.Max();
int highestWorld = lag.IndexOf(highest);
int average = (int)nozeros.Average();