Как создать тест скорости загрузки с помощью .NET(С#)
Я хочу создать тест скорости для проверки соединения.
Я бы хотел загрузить 15 секунд, что затем дает мне среднюю скорость загрузки.
Кто-нибудь знает, как это создать? или есть лучшая идея сделать тест скорости?
Спасибо за чтение!
Ответы
Ответ 1
Этот пример попытается загрузить googletalk, а затем выведет информацию о загрузке.
пс. при попытке времени и работы избежать использования DateTime, поскольку они могут вызвать проблемы или неполадки, всегда используйте Секундомер, доступный в пространстве имен System.Diognostics.
const string tempfile = "tempfile.tmp";
System.Net.WebClient webClient = new System.Net.WebClient();
Console.WriteLine("Downloading file....");
System.Diagnostics.Stopwatch sw = System.Diagnostics.Stopwatch.StartNew();
webClient.DownloadFile("http://dl.google.com/googletalk/googletalk-setup.exe", tempfile);
sw.Stop();
FileInfo fileInfo = new FileInfo(tempfile);
long speed = fileInfo.Length / sw.Elapsed.Seconds;
Console.WriteLine("Download duration: {0}", sw.Elapsed);
Console.WriteLine("File size: {0}", fileInfo.Length.ToString("N0"));
Console.WriteLine("Speed: {0} bps ", speed.ToString("N0"));
Console.WriteLine("Press any key to continue...");
Console.ReadLine();
Ответ 2
Как publicENEMY, ответ kay.one может дать неправильную скорость, потому что Скорость жесткого диска может быть ниже, чем скорость сети (например: Гигабитное волокно Google намного быстрее, чем средняя скорость записи на жестком диске 5200 об/мин)
Это пример кода, полученного из ответа kay.one, но загружает содержимое данных в System.Byte[]
и, следовательно, в память.
Также я замечаю, что после самой первой загрузки скорость резко возрастает и перескакивает через реальную скорость сети, потому что System.Net.WebClient
использует кеш загрузки IE: для моих требований я добавляю только параметр t
querystring, явно уникальный для каждого запроса.
Console.WriteLine("Downloading file....");
var watch = new Stopwatch();
byte[] data;
using (var client = new System.Net.WebClient())
{
watch.Start();
data = client.DownloadData("http://dl.google.com/googletalk/googletalk-setup.exe?t=" + DateTime.Now.Ticks);
watch.Stop();
}
var speed = data.LongLength / watch.Elapsed.Seconds;
Console.WriteLine("Download duration: {0}", watch.Elapsed);
Console.WriteLine("File size: {0}", data.Length.ToString("N0"));
Console.WriteLine("Speed: {0} bps ", speed.ToString("N0"));
Console.WriteLine("Press any key to continue...");
Console.ReadLine();
Ответ 3
- Используйте известный размер файла и ловушку, сколько времени требуется для загрузки. (используя два DateTime.now() s)
В CodeProject есть библиотека, которую я нашел. Это несколько классов С#, которые позволяют отслеживать сетевые подключения, включая скорость загрузки и загрузки. Ссылка здесь
Ответ 4
как файл загрузки даст вам правильную скорость ссылки.
то, что вы получаете при загрузке файла, является большой недооценкой фактической скорости, которую вы получаете.
Я думаю, что вы должны сделать некоторый вид передачи пакета udp и найти время, необходимое для его получения на другом конце.
С уважением,
Ответ 5
В Visual Basic dot net класс "Мой" предоставляет функцию для загрузки файлов, попытайтесь найти его псевдоним в С#. Затем создайте счетчик таймера и подсчитайте секунды с момента начала загрузки.
Ответ 6
Используйте код для проверки скорости подключения к Интернету с помощью С#:
private long bytesReceivedPrev = 0;
private void CheckBandwidthUsage(DateTime now)
{
NetworkInterface[] interfaces = NetworkInterface.GetAllNetworkInterfaces();
long bytesReceived = 0;
foreach (NetworkInterface inf in interfaces)
{
if (inf.OperationalStatus == OperationalStatus.Up &&
inf.NetworkInterfaceType != NetworkInterfaceType.Loopback &&
inf.NetworkInterfaceType != NetworkInterfaceType.Tunnel &&
inf.NetworkInterfaceType != NetworkInterfaceType.Unknown && !inf.IsReceiveOnly)
{
bytesReceived += inf.GetIPv4Statistics().BytesReceived;
}
}
if (bytesReceivedPrev == 0)
{
bytesReceivedPrev = bytesReceived;
}
long bytesUsed = bytesReceived - bytesReceivedPrev;
double kBytesUsed = bytesUsed / 1024;
double mBytesUsed = kBytesUsed / 1024;
internetUsage.Add(now, mBytesUsed);
if (internetUsage.Count > 20)
{
internetUsage.Remove(internetUsage.Keys.First());
}
bytesReceivedPrev = bytesReceived;
}
private void CheckInternetSpeed(DateTime now)
{
WebClient client = new WebClient();
Uri URL = new Uri("http://sixhoej.net/speedtest/1024kb.txt");
double starttime = Environment.TickCount;
client.DownloadFile(URL, Constants.GetAppDataPath() + "\\" + now.Ticks);
double endtime = Environment.TickCount;
double secs = Math.Floor(endtime - starttime) / 1000;
double secs2 = Math.Round(secs, 0);
double kbsec = Math.Round(1024 / secs);
double mbsec = kbsec / 100;
internetSpeed.Add(now, mbsec);
if (internetSpeed.Count > 20)
{
internetSpeed.Remove(internetSpeed.Keys.First());
}
client.Dispose();
try
{
// delete downloaded file
System.IO.File.Delete(Constants.GetAppDataPath() + "\\" + now.Ticks);
}
catch (Exception ex1)
{
Console.WriteLine(ex1.Message);
}
}