私はC#Webクローラーを作成しています。プロファイリングを実行すると、 HTMLAgilityPack's LoadHTML
メソッドがプログラム全体のCPU使用率の10%を使用していることがわかります。これを試して下げたいと思います。
私は正規表現がより速くなると確信していますが、私はリンクの例を抜き出して見ていますので、誰もがこのメソッドをHTMLAgilityPack
ようなhtmlパーサーにするのは避けるべきだと言っています。
私がやる必要があるのは、HTMLからHTMLAgilityPack
を使ってリンクを抽出することです。
私がリンクを抽出するためだけに使っているように、HTMLパーサを私のケースに適用する理由はありますか?
WebClientでダウンロードしたHTMLを比較した。
href\\s*=\\s*(?:[\"'](?<1>[^\"']*)[\"']|(?<1>\\S+))
トリミング、リストへの追加)は、HTMLAgilityPackよりも高速です。
一貫して3と比較して43ミリ秒。
ペーストビンのコードを見てください
私がリンクを抽出するためだけに使っているように、HTMLパーサを私のケースに適用する理由はありますか?
あなたのケースでは、HTMLパーサーはあなたのテストが示すように過剰です。
SOで答えている人は、すべての正規表現の質問に対する動詞として答えを使用します。実際にHTMLのドメインをより堅牢な方法で解析する必要がある場合は、このツールを使用する必要があります。
正規表現に対する偏見は、彼らが遅すぎる、または面倒であると感じる人によって発見されます。特定の操作のために提案されたものにはメリットがあります。確かに私は同意するが、正規表現を手放すために、よくStackOverflowのコースのためのパーです。
それはなぜですか?提供されたパターンが不必要なバックトラッキングを導入し、最適化されていないため、解析に欠陥があることがあります。それは正規表現をゲートから外します。 1つは正規表現の言語を学び、正規表現のエンジンを汚染させないために何をしているのかを理解する必要があります。
たとえば 、私はあなたの同じC#コードテストを受けましたが、あなたと私自身の最適化されたパターンを使用し、一貫して1ミリ秒にまで短縮できました!
ほとんどの人は、 *
検索することで基本的なパターンマッチングを学びます。彼らが最初に正規表現を学ぶとき、彼らは*
を使う.
.*
。無差別の使用に伴い、そのステップ*
最も可能性の高いバックトラックと遅い応答の地獄に任意の非開始パターンを運命になるだろう。
経験的にアイテムがないことが分かっている場合を除いて、 +
を使用してください。
2009年には私のブログでこの件について書いたのですか?C#.Net正規表現はあなたのために十分に速いですか?