2009-07-05 12 views

Odpowiedz

3
  • Użyj znanego rozmiaru pliku i pułapki, ile czasu potrzeba, aby pobrać. (używając dwóch DateTime.now() s)

Istnieje biblioteka na CodeProject, którą znalazłem. Jest to kilka klas C#, które umożliwiają monitorowanie połączeń sieciowych, w tym prędkości wysyłania i pobierania. Link here

0

W sieci Visual Basic, klasa "My" zapewnia funkcję pobierania plików, spróbuj wyszukać swój alias w języku C#. Następnie utwórz licznik czasu i licz na sekundę od rozpoczęcia pobierania.

15

Ta próbka będzie próbować pobrać googletalk, a następnie wyświetli szczegóły pobierania.

ps. podczas próby czasu i działania należy unikać używania DateTime, ponieważ mogą one powodować problemy lub niedokładność, zawsze używaj Stopwatch dostępnego w przestrzeni nazw 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(); 
+1

Podczas próby profilu kodu na bardzo dobrym poziomie należy unikać DateTime.Now(). Ale dla czegoś takiego jak pobieranie pliku (które trwa znacznie dłużej niż precyzja Now), jest w porządku. – colithium

+0

Lub użyj "QueryPerformanceFrequency" i "QueryPerformanceCounter" jako czasomierza. – Icebob

+4

po co używać problemów z licznikami wydajności, a nawet z DateTime.Now, gdy stoper jest łatwy w użyciu i zbudowany w tym celu. Ułatwia to również zrozumienie twojego kodu, ponieważ jest oczywiste, że masz czas na funkcję. –

2

w jaki sposób plik do pobrania może podać poprawną prędkość łącza. to, co dostajesz pobierając plik, jest bardzo niedoszacowane z rzeczywistej prędkości, którą dostajesz.

Co myślę, że powinieneś wykonać pewien rodzaj transferu pakietów i znaleźć czas potrzebny na jego odebranie na drugim końcu.

pozdrowienia,

0

Użyj kodu, aby sprawdzić szybkość połączenia internetowego przy użyciu C#:

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

Jak publicENEMY mówi odebrać kay.one „s może dać błędne prędkość, ponieważ prędkość dysku twardym może być niższa niż szybkość sieci (na przykład: Gigabitowe włókno Google jest dużo szybsze niż średnia prędkość zapisu na dysku twardym 5200 obr/min)

To jest przykładowy kod wywodzący się z odpowiedzi kay.one, ale pobiera d o treści do System.Byte[], a więc w pamięci.

Zauważam również, że po pierwszym pobraniu szybkość gwałtownie wzrasta i przeskakuje przez rzeczywistą prędkość sieci, ponieważ System.Net.WebClient wykorzystuje pamięć podręczną pobierania IE: dla moich wymagań dodam jedynie parametr zapytania t, wyraźnie unikalny dla każdego żądania .

EDIT

as.beaulieu znajdzie problem korzystając TimeSpan.Seconds do obliczenia zarówno dla bardzo szybkich i bardzo powolne pliki do pobrania.

Po prostu potrzebujemy użyć TimeSpan.TotalSeconds zamiast tego.

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.TotalSeconds; // instead of [Seconds] property 

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

Dowiedziałem się wiele z tej odpowiedzi. Dziękuję Ci bardzo! – Owen

+0

Mam problemy, w których moje pobieranie jest tak szybkie, że kilka milisekund, w których to trwa, są zaokrąglane do zera, a otrzymuję błąd dzielenia przez zero w wierszu "var speed = ...". Jak najlepiej to poprawić? –

+1

@ as.beaulieu masz rację, i pokazujesz kolejny możliwy problem z tym kodem: jeśli pobieranie trwa ponad minutę, "Drugi" podaje błędną wartość dla naszego obliczenia. Zaktualizowałem kod, wystarczy użyć 'TotalSeconds'. –

Powiązane problemy