【问题标题】:C# (.NET), how to fix web response performance, too much elapsed timeC# (.NET),如何修复 Web 响应性能,已用时间过多
【发布时间】:2017-02-04 14:18:27
【问题描述】:

我需要优化我的代码,响应时间为 1 秒,ReadToEnd() 时间为 0.5 秒,所有其他代码(带有完整的网络请求)只需 0.1 秒。

request2.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;

//This 1sec+
HttpWebResponse response = (HttpWebResponse)request2.GetResponse();
StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8);

//This 0.5sec+
string mem = sr.ReadToEnd();
sr.Close();  

P.S:HTML 代码大约 200k+ 个字符,但我只需要 4-5 个。

【问题讨论】:

    标签: c# html .net http httpwebresponse


    【解决方案1】:

    很可能,没有为您的HttpWebResponse 设置代理设置会导致延迟。始终建议设置代理,即使它不使用。也可以尝试使用using 子句:

    request2.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;
    
    request2.Proxy = null;
    using (HttpWebResponse response = (HttpWebResponse)request2.GetResponse())
    {
        StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
        string mem = sr.ReadToEnd();
    }
    

    【讨论】:

    • 没用,同一时间(1.5-1.7 秒)
    【解决方案2】:

    初始 GetResponse 调用会生成安全协商、Get 和执行,然后是 HTTP 响应,其前几个字节包含 Http 响应代码(200,500,404 等)。

    响应的主体可能已经被您的客户端 Http 缓冲区接收到,或者仍在流式传输到其中 - 您无法确定。您的第二次调用 (readToEnd) 读取接收缓冲区中的所有字节,并等待服务器发送 Http 标头中指示的所有字节。

    您的代码不太可能对 Web 服务调用的执行时间造成任何可观的成本,而且我看不到任何可能的优化步骤 - 您需要确定在没有您的客户端代码的情况下调用需要多长时间。

    使用 Telerik Fiddler 跟踪从目标 Web 服务调用的字节数,以及从服务器到客户端的原始传输所花费的时间 - 只需在 Fiddler 或 Web 浏览器上调用 URL 即可。这将隔离您的代码、服务器或连接延迟是否会花费时间。

    【讨论】:

    • 205241 (get) + 1809 (post), 2.6 sec in web browser, 205219 + 1789, 2.1 sec in my client.所以字节长度是相同的,但我不需要第二个响应的 205k,我只需要从整个 html 代码中取一个数字,它不可能只得到部分代码?响应总是占用所有 html 页面?
    • 我认为您可能在这里遗漏了一点 - 服务器响应 Get 调用需要多长时间?这就是我推荐 Fiddler 的原因——它是免费的——它会告诉你客户端收到第一个字节需要多长时间——“第一个字节的时间”和“最后一个字节的时间”。您仍然不知道传输数据需要多长时间,以及服务器需要多长时间创建返回数据发送给您。 Fiddler“第一个字节的时间”是您将代码降至最低的绝对最小值 - 所以了解它很重要。您可能会发现 205k 的数据需要很短的时间。
    【解决方案3】:

    除了使用usingsetting proxy to null 的其他建议之外,您可能还想尝试只读取特定数量的字符,而不是读取所有内容。

    var content = new char[10];
    sr.Read(content, 0, content.Length);
    string contentStr = new String(content);
    

    【讨论】:

      【解决方案4】:

      检查您的 js 脚本不依赖于其他服务、存储库等。它以前在我的项目中为我工作过。下载它们并将其移动到您的本地文件夹

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-10-10
        • 2021-11-11
        • 1970-01-01
        • 2022-01-26
        • 2017-07-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多