[英]Calculating minimum/maximum/average ping reponse
因此,這是一個測試流行的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();
}
}
}
}
您可以跳過零嗎? 同樣,您也可以將所有計算放在一個循環中。
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.
}
您可以使用這些功能獲得最小值,最大值和平均值。
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();
首先考慮並行運行所有內容(此處一次運行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());
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.