2 Stimmen

Berechnung der minimalen/maximalen/durchschnittlichen Ping-Antwort

Hier ist also eine Anwendung, die jeden Server des beliebten Spiels RuneScape testet. Ich lasse den Ping auf jedem der 139 Server laufen und füge den Lag-Wert zum Array hinzu. Beim Durchlaufen der Listeneinträge kann ich den durchschnittlichen, minimalen und maximalen Lag für jeden Server berechnen.

Nun, in meinem Code, wenn einer der unerreichbaren Server vermerkt ist die niedrigste Verzögerung zeigt als 0. Ich bin nicht sicher, wie zu behandeln, wenn meine Ping-Antwort erreicht hat, es ist Timeout und Beiträge 0 zu Array-Liste.

Was kann ich tun, um zu vermeiden, dass 0 mein niedrigster Ping ist, wenn der Server nicht erreichbar ist?

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();
            }
        }
    }
}

2voto

Adam Liss Punkte 46031

Können Sie die Nullen einfach überspringen? Außerdem könnten Sie alle Berechnungen in einer einzigen Schleife durchführen.

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.
}

1voto

Chuck Savage Punkte 11491

Mit diesen Funktionen können Sie das Minimum, das Maximum und den Durchschnitt ermitteln.

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();

1voto

yamen Punkte 15060

Ziehen Sie zunächst in Erwägung, alles parallel zu betreiben (hier 4 auf einmal):

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();

Sammeln Sie dann nur die gültigen Ergebnisse, notieren Sie mit PingReply.Status anstatt zu prüfen, ob 0 :

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

Hier sind die Informationen, die Sie brauchen:

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());

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X