我需要一个可以在 .Net 中使用的 Http 请求,该请求需要不到 100 毫秒。我能够在浏览器中实现这一点,所以我真的不明白为什么这在代码中是一个问题。
我尝试过 WinHTTP 以及 WebRequest.Create,它们都超过 500 毫秒,这对于我的用例来说是不可接受的。
以下是我试图通过的简单测试的示例。 (WinHttpFetcher 是我编写的一个简单包装器,但它执行了最简单的 Get 请求示例,我不确定它是否值得粘贴。)
我使用 LibCurlNet 得到了可接受的结果,但如果同时使用该类,我会遇到访问冲突。此外,由于它不是托管代码并且必须复制到 bin 目录,因此与我的开源项目一起部署并不理想。
有其他实现的想法可以尝试吗?
[Test]
public void WinHttp_Should_Get_Html_Quickly()
{
var fetcher = new WinHttpFetcher();
var startTime = DateTime.Now;
var result = fetcher.Fetch(new Uri("http://localhost"));
var endTime = DateTime.Now;
Assert.Less((endTime - startTime).TotalMilliseconds, 100);
}
[Test]
public void WebRequest_Should_Get_Html_Quickly()
{
var startTime = DateTime.Now;
var req = (HttpWebRequest) WebRequest.Create("http://localhost");
var response = req.GetResponse();
var endTime = DateTime.Now;
Assert.Less((endTime - startTime).TotalMilliseconds, 100);
}
在进行基准测试时,最好至少放弃前两个计时,因为它们可能会扭曲结果:
- 时机 1:以 JIT 开销为主,即将字节码转换为本机代码的过程。
- 时机 2:JIT 代码的可能优化过程。
此后的计时将更好地反映重复性能。
以下是一个测试工具的示例,它将自动忽略 JIT 和优化过程,并在取平均值以断言性能之前运行测试一定次数的迭代。正如您所看到的,JIT 传递需要大量时间。
JIT:410.79ms
优化:0.98ms.
平均超过 10 次迭代:0.38ms
Code:
[Test]
public void WebRequest_Should_Get_Html_Quickly()
{
private const int TestIterations = 10;
private const int MaxMilliseconds = 100;
Action test = () =>
{
WebRequest.Create("http://localhost/iisstart.htm").GetResponse();
};
AssertTimedTest(TestIterations, MaxMilliseconds, test);
}
private static void AssertTimedTest(int iterations, int maxMs, Action test)
{
double jit = Execute(test); //disregard jit pass
Console.WriteLine("JIT:{0:F2}ms.", jit);
double optimize = Execute(test); //disregard optimize pass
Console.WriteLine("Optimize:{0:F2}ms.", optimize);
double totalElapsed = 0;
for (int i = 0; i < iterations; i++) totalElapsed += Execute(test);
double averageMs = (totalElapsed / iterations);
Console.WriteLine("Average:{0:F2}ms.", averageMs);
Assert.Less(averageMs, maxMs, "Average elapsed test time.");
}
private static double Execute(Action action)
{
Stopwatch stopwatch = Stopwatch.StartNew();
action();
return stopwatch.Elapsed.TotalMilliseconds;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)