2009-07-05 38 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();