对于学校作业,我必须证明,下载1mb文件100次比单次下载100mb文件要慢。
理论上讲:下载1mb文件100次需要更多的总字节数,因为随之发送的标头。
现在我编写了一个脚本,对两个场景进行计时并在控制台中显示它。 但是,我想显示收到的字节总数,以显示为什么需要更长时间。
这是我到目前为止所做的:
class TestClass
{
private Stopwatch timer;
private WebClient downloader;
private TimeSpan elapsed;
private string elapsedTime;
public void SetUp()
{
timer = new Stopwatch();
downloader = new WebClient();
}
public void StartTest()
{
Console.WriteLine("Starting test");
Console.WriteLine("Downloading 1mb file x100, please wait...");
timer.Start();
for (int i = 0; i < 100; i++)
{
downloader.DownloadFile("http://ftp.telfort.nl/pub/test/1megabyte.bin", @"c:\tempdownload\1mb.txt");
}
timer.Stop();
elapsed = timer.Elapsed;
// Format and display the TimeSpan value.
elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
elapsed.Hours, elapsed.Minutes, elapsed.Seconds,
elapsed.Milliseconds / 10);
Console.WriteLine("RunTime when downloading 1MB 100 times is: " + elapsedTime);
// Now go for 100MB
timer.Reset();
Console.WriteLine("Downloading 100mb file 1x, please wait...");
timer.Start();
downloader.DownloadFile("http://ftp.telfort.nl/pub/test/100megabyte.bin", @"c:\tempdownload\100mb.txt");
timer.Stop();
elapsed = timer.Elapsed;
// Format and display the TimeSpan value.
elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
elapsed.Hours, elapsed.Minutes, elapsed.Seconds,
elapsed.Milliseconds / 10);
Console.WriteLine("RunTime when downloading 100MB 1 time is: " + elapsedTime);
// Finally
Console.WriteLine("Press any key to continue...");
Console.ReadKey();
}
}
有没有办法实现这个目标?
编辑:我认为标题可能会产生误导......
答案 0 :(得分:2)
所以你想测量整个反应的大小。
BCL提供的HTTP类(HttpWebResponse,WebClient,HttpClient)无法提取整个请求或响应消息大小(包括status-line,response-headers和message-body)。
您可以通过计算标题名称和值的长度来模拟这一点,但由于折叠和多个标题缩进到一个字典条目中,这将不完全准确。
您可以使用套接字轻松制作一个简单的HTTP GET请求,并且只需发出HTTP / 1.0请求,让服务器在发送完整响应后关闭连接(这样您就不必重新实现HTTP客户端了)在套接字上。)
但标题不是你的问题。对于1 MB的文件,超过100个HTTP请求,请求和响应头将占每个请求约150个字节,或者总转移100 MB有效载荷的边际15 KB。
真正的延迟将由创建100个单独的TCP连接以及它们典型的慢启动引起。