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

时间:2009-07-05 14:45:17

标签: c#

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

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

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

7 个答案:

答案 0 :(得分: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();

答案 1 :(得分:9)

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

这是一个源自kay.one答案的示例代码,但会将数据内容下载到System.Byte[],因此会在内存中。

另外我注意到,在第一次下载后,速度急剧增加并超过实际网络速度,因为System.Net.WebClient使用IE的下载缓存:根据我的要求,我只添加{{ 1}} querystring参数,对于每个请求都是唯一的。

修改

as.beaulieu发现使用t进行计算的问题,包括非常快和非常慢的下载。

我们只需要使用TimeSpan.Seconds

TimeSpan.TotalSeconds

答案 2 :(得分:3)

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

我发现CodeProject上有一个库。这是一些C#类,可让您监控网络连接,包括上传和下载速度。 Link here

答案 3 :(得分:2)

下载文件如何为您提供正确的链接速度。 你通过下载文件获得的是对你得到的实际速度的低估。

我认为您应该进行一些udp类别的数据包传输,并找到在另一端接收它所需的时间。

的问候,

答案 4 :(得分:0)

在Visual Basic dot net中,“My”类提供了下载文件的功能,尝试在C#中搜索其别名。然后创建一个计时器计数器,并计算自下载开始以来经过的秒数。

答案 5 :(得分: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);
        }
    }

答案 6 :(得分:0)

出版物Understanding broadband speed measurements

这可能有助于希望使用支持理论实施速度测试的人。 一般算法可以看这里:

Ookla Algorithm