如何使用.NET创建下载速度测试

Aus*_*rne 18 c#

我想创建一个速度测试来测试连接.

我想要的是一个15秒的下载,然后给我平均下载速度.

谁知道如何创建这个?或者有更好的想法进行速度测试?

kay*_*one 15

此示例将尝试下载googletalk,然后输出下载的详细信息.

PS.当尝试时间和操作避免使用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();
Run Code Online (Sandbox Code Playgroud)

  • 为什么要经历使用性能计数器甚至DateTime的麻烦.当秒表易于使用并为此目的而构建时.它还使您的代码易于理解,因为很明显您正在为一个函数计时. (4认同)
  • 在速度计算中,使用 TotalSeconds,而不是 Seconds(这是整数)。 (2认同)

T-m*_*oty 10

正如publicENEMY所说,kay.one的答案可能会给出错误的速度,因为HDD的速度可能低于网络速度(例如:Google千兆光纤比5200rpm HDD的平均写入速度快得多)

这是从kay.one的答案派生的示例代码,但是将数据内容下载到a 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();
Run Code Online (Sandbox Code Playgroud)


Mat*_*ell 4

  • 使用已知的文件大小并捕获下载所需的时间。(使用两个 DateTime.now())

我在 CodeProject 上找到了一个库。它是几个 C# 类,可让您监视网络连接,包括上传和下载速度。链接在这里