C# 对于某些服务器,.NET Core 2.2 HttpClient/WebClient与Curl-.NET libs相比速度非常慢
编辑:添加了复制示例+我正在使用.NETCore2.2.203在Ubuntu18.04上运行这个(在所有服务器上) 编辑:从我的Windows 10笔记本电脑在家测试;同样的结果 我有一段非常简单的HttpClient代码(建议使用静态代码,但我也使用()进行了测试): 然后是卷曲:C# 对于某些服务器,.NET Core 2.2 HttpClient/WebClient与Curl-.NET libs相比速度非常慢,c#,curl,httpclient,webclient,C#,Curl,Httpclient,Webclient,编辑:添加了复制示例+我正在使用.NETCore2.2.203在Ubuntu18.04上运行这个(在所有服务器上) 编辑:从我的Windows 10笔记本电脑在家测试;同样的结果 我有一段非常简单的HttpClient代码(建议使用静态代码,但我也使用()进行了测试): 然后是卷曲: time curl -L "url" > /dev/null 对于猞猁: time lynx "url" > /dev/null 差别是惊人的;这实际上取决于
time curl -L "url" > /dev/null
对于猞猁:
time lynx "url" > /dev/null
差别是惊人的;这实际上取决于请求的服务器/url,但我发现HttpClient与curl/lynx对来自同一服务器的请求的速度相差2-50倍
我尝试了我能找到的所有修复方法
不带代理的HttpHandler(UseProxy=false,proxy=null)
使用await而不是.Result(这并不是说这会产生影响,事实上也不会)
网络客户
ModernHttpClient
卷发卷得很薄
最后一个选项(显然)给出了正确的结果,其余的(.NET选项)速度非常慢
现在我使用Curl包装器,因为.NET结果不正确,会减慢堆栈速度
以前有人吃过这个吗?我尝试了谷歌提供的所有“修复”,但都没有提供任何帮助
编辑:来自评论中的Matthiee,如果您使用Powershell运行Windows,这也会复制它
(Measure命令-Expression{$site=Invoke WebRequest-Uri“reddit.com”)。毫秒
编辑:要复制的代码:
用于:
dotnet run -- https://reddit.com
要检查20次的小脚本,运行时使用:
./runbench https://reddit.com
问题得到了解决,这是导致大部分目标受众网站没有缓存内容的综合因素。与HttpClient无关(除此之外,它不发送用户代理)
阅读评论了解更多信息 使用同步方法是否也会发生这种情况?请提供一个允许我们重现差异的url。是的,例如DownloadString()也会出现这种情况。Reddit.com就是一个很好的例子;在HttpClient等设备上,我得到约1800ms,而curl始终给我<200ms。同样,从同一台(千兆位管道)服务器测量。无论精确的定时值如何;该服务器的HttpClient(是的,我尝试了不同的服务器;结果相同)在curl和HttpClient的30个请求中提供了5-10倍的速度。对我来说,速度也慢了5倍。。我用它来测量时间`(measure命令-表达式{$site=Invoke WebRequest-Uri”“});我使用的所有Linux机器都有ipv6。让我通过关机来测试我的笔记本电脑。=>不,不是这样。您是否尝试使用同一个HttpClient连接多次?也许有一些初始化需要很长时间,尽管1600毫秒的差异对于任何初始化代码来说似乎都太大了
using System;
using System.Diagnostics;
using System.Net.Http;
namespace Download.Playground
{
class Program
{
static HttpClient client;
static void Main(string[] args)
{
HttpClientHandler hch = new HttpClientHandler();
hch.Proxy = null;
hch.UseProxy = false;
client = new HttpClient(hch);
Stopwatch sw = new Stopwatch();
sw.Start();
var result = client.GetAsync(args[0]).Result;
sw.Stop();
Console.WriteLine($"Spent {sw.ElapsedMilliseconds}ms");
}
}
}
./runbench https://reddit.com
#!/bin/bash
for i in {1..20}
do
dotnet run -- $1
time curl -L $1 > /dev/null
done