Использование процессора htmlagilitypack более 50% в многопоточности - PullRequest
0 голосов
/ 07 февраля 2012

мое приложение использует 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);
      }
}

приведенный выше код работает без проблем, средний процессор равен 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 add, вызовите метод CreateHtmlDocument:

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

, запустив вышеописанный код снова,средняя скорость процессора до 50-60% (средний размер файла - 80 КБ). если я уменьшу номер потока до 1, то скорость процессора снизится до 2% -5%.

Я фиксирую выборку процессора по производительности Visual Studio в моих продуктах (не приведенный выше код):

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

1 Ответ

2 голосов
/ 07 февраля 2012

Так в чем ваша проблема?

HTML-анализатор с использованием процессора? Что вы ожидали - загрузок нет, HTML-разбор использует процессор, и если вы используете много параллельных потоков, то да, это сложится.

Не так много, что вы можете сделать - оптимизируйте HtmlAgilityPack через провайдера, чтобы увидеть, есть ли там узкое место. Если нет ... ну ... получите более быстрый процессор / больше серверов или оптимизируйте свой код.

Проголосуйте за закрытие и -1 - я не вижу здесь ни одного связанного с этим вопроса, кроме: «Боже мой, мой процессор используется, когда он должен выполнять работу».

...