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();
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
Lub użyj "QueryPerformanceFrequency" i "QueryPerformanceCounter" jako czasomierza. – Icebob
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ę. –