2009-07-05 71 views

回答

3
  • 使用已知的文件大小和陷阱需要多長時間下載。 (使用兩個DateTime.now()s)

我發現CodeProject上有一個庫。這是幾個C#類,讓你監視你的網絡連接,包括上傳和下載速度。 Link here

0

在Visual Basic點網中,「我的」類提供了一個函數來下載文件,嘗試在C#中搜索其別名。然後創建一個計時器計數器並計算自下載開始以來的秒數。

15

此示例將嘗試下載googletalk,然後輸出下載的詳細信息。

ps。在嘗試計時和操作時避免使用DateTime,因爲它們可能會導致問題或不確定,因此請始終使用System.Diognostics命名空間中提供的Stopwatch。

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

當試圖在非常好的級別剖析代碼時避免使用DateTime.Now()。但是對於像文件下載這樣的事情來說(這比現在的精度要長),這就好了。 – colithium 2009-07-05 20:47:31

+0

或者使用'QueryPerformanceFrequency'和'QueryPerformanceCounter'作爲定時器。 – Icebob 2009-07-06 07:29:47

2

如何下載文件給你正確的鏈接速度。 通過下載文件得到的結果是對實際速度的低估。

我認爲你應該做一些udp類型的數據包傳輸,並找到在另一端接收它所需的時間。

問候,

0

使用代碼使用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

作爲publicENEMY稱,kay.one的回答會給人一種錯誤的速度,因爲硬盤的轉速可以更低(例如:Google千兆位光纖比5200rpm硬盤的平均寫入速度快得多)

這是一個衍生自kay.one的答案的示例代碼,但下載d ata內容轉換爲System.Byte[],因此在內存中。

此外,我注意到,第一個下載後,顯着的速度增加,並躍過實際網絡速度,因爲System.Net.WebClient使用IE的下載緩存:對於我的要求,我只加了t查詢參數,明確唯一爲每個請求。

編輯

as.beaulieu發現使用TimeSpan.Seconds進行計算的問題,無論是速度非常快,非常緩慢的下載。

我們只需要使用TimeSpan.TotalSeconds來代替。

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