【问题标题】:htmlagilitypack usage cpu more than 50% in the multi-threadshtmlagilitypack 在多线程中使用 cpu 超过 50%
【发布时间】:2012-02-07 07:51:34
【问题描述】:

我的应用程序使用 10 个线程来读取大量 html 文件。类似于以下代码:

for (int i = 0; i < 10; i++)
{
    new Thread(ParserHtmlWork)
    {
       IsBackground = true
    }.Start();
}

void ParserHtmlWork()
{            
      while (true)
      {
          //read the next file from the queue.
          var filePath = Query.Enqueue();
          using (var stream = OpenFile(filePath))
          {
              stream.Close();
          }
          System.Threading.Thread.Sleep(800);
      }
}

上面的代码运行没问题,平均cpu是2%-5%,接下来我更改我的代码,将htmlagilitypack库添加到解析器html。

private HtmlDocument CreateHtmlDocument(Stream stream, Encoding encoding)
{
    var doc = new HtmlDocument();
    ////Defines if the 'id' attribute must be specifically used. 
    doc.OptionUseIdAttribute = false;
    //Defines if declared encoding must be read from the document. 
    //Declared encoding is determined using the meta http-equiv="content-type" content="text/html;charset=XXXXX" html node
    doc.OptionReadEncoding = false;
    doc.Load(stream, encoding);
    return doc;
}

更改 ParserHtmlWork 方法添加调用 CreateHtmlDocument 方法:

 using (var stream = OpenFile(filePath))
 {
     CreateHtmlDocument(stream, Encoding.UTF8);
     stream.Close();
 }

再次运行以上,平均 cpu 高达 50-60%(平均文件大小为 80k)。如果我将线程数减少到 1,则平均 cpu 下降到2%-5%。

我通过我的产品(不是上面的代码)中的 Visual Studio 性能捕获 cpu 采样:

ApplicationEngine.Start()
Inclusive Samples: 398
Exclusive Samples: 0
Inclusive Samples %: 76
Exclusive Samples %: 0

ApplicationEngine.DoWork(class System.IO.Stream)
Inclusive Samples: 337
Exclusive Samples: 0
Inclusive Samples %: 64.44
Exclusive Samples %: 0.00

CreateHtmlDocument(class System.IO.Stream,class System.Text.Encoding)
Inclusive Samples: 298  
Exclusive Samples: 0
Inclusive Samples %: 56.98
Exclusive Samples %: 0.00

HtmlAgilityPack.HtmlDocument.Load(class System.IO.Stream,class System.Text.Encoding)
Inclusive Samples: 296
Exclusive Samples: 0
Inclusive Samples %: 56.60
Exclusive Samples %: 0.00

HtmlAgilityPack.HtmlDocument.Load(class System.IO.TextReader)
Inclusive Samples: 294
Exclusive Samples: 0
Inclusive Samples %: 56.21
Exclusive Samples %: 0.00

HtmlAgilityPack.HtmlDocument.Parse()
Inclusive Samples: 273
Exclusive Samples: 13
Inclusive Samples %: 52.20
Exclusive Samples %: 2.49

HtmlAgilityPack.HtmlDocument.PushNodeEnd(int32,bool)
Inclusive Samples: 135
Exclusive Samples: 2
Inclusive Samples %: 25.81
Exclusive Samples %: 0.38

[clr.dll]   130 106 24.86   20.27

System.String.ToLower()             
Inclusive Samples: 118
Exclusive Samples: 118
Inclusive Samples %: 22.56
Exclusive Samples %: 22.56

HtmlAgilityPack.HtmlNode.get_Name()             
Inclusive Samples: 81
Exclusive Samples: 3
Inclusive Samples %: 15.49
Exclusive Samples %: 0.57

【问题讨论】:

    标签: c# performance html-agility-pack


    【解决方案1】:

    那么你的问题是什么?

    使用 CPU 的 HTML 解析器?你期望什么 - 下载没有,HTML解析使用CPU,如果你使用很多并行线程,那么是的,这会加起来。

    您可以做的不多 - 通过一个 proviler 优化 HtmlAgilityPack 以查看那里是否存在瓶颈。如果不是……那么……获得更快的处理器/更多服务器或优化您的代码。

    投票关闭和-1 - 除了“哦,我的上帝,我的 CPU 在必须工作时使用”之外,我在这里看不到任何相关问题。

    【讨论】:

    • 我认为 HtmlAgilityPack 在多线程中存在瓶颈。我会尝试找到解决方案或其他解决方案。
    • 可能,但基本上预计在 10 个线程工作时使用 10% 的 cpu,并且 - 分析器运行会显示可能的瓶颈,很容易调查并在他们的论坛上发布;)
    • @TomTom 如果 HtmlAgilityPack 确实有瓶颈,可以做些什么来使解析器成为多线程的?
    猜你喜欢
    • 2018-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-02
    • 2012-04-03
    • 1970-01-01
    • 2013-11-05
    相关资源
    最近更新 更多