みんなにパーサー! 既存のHTMLパーサーの分析とテスト



みなさんこんにちは!

前の記事が公開された後、あるソリューションが他のソリューションより優れている理由を示し、証明するように求めるメールがかなりの数のメールに送られました。
私は熱心に比較し始めましたが、いつものように、すべては一見思われるよりも少し複雑です。

はい、この記事では、すべてのパーサーをテーブルとメジャーに配置することを提案します!

さあ始めましょう!

何かを比較する前に、理解する必要があります。実際に比較したいものは何ですか?! HTMLパーサーを比較したいのですが、HTMLパーサーとは何ですか?

HTMLパーサーは次のとおりです。
  1. トークナイザー-テキストをトークンに分解
  2. ツリーの構築(ツリービルダー)-ツリーの「正しい位置に」トークンを配置する
  3. 木材を使用したその後の作業

「寒い」人は次のように言うことができます。-「トークンを取得するのに十分なので、HTMLを解析するためにツリーを構築する必要はありません。」 残念ながら、それは間違っています。
事実、正しいhtmlトークン化のためには、手元にツリーが必要です。 パラグラフ1と2は不可分です。

2つの例を示します。

最初のもの:
<svg><desc><math><style><a> 

適切な処理の結果:
 <html> <head> <body> <svg:svg> <desc:svg> <math:math> <style:math> <a:math> 


第二:
 <svg><desc><style><a> 

適切な処理の結果:
 <html> <head> <body> <svg:svg> <desc:svg> <style> <-text>: <a> 


「:」の後に名前空間が続きます。指定しない場合は、html。

2つの例は、STYLE要素が配置場所によって動作が異なることを示しています。 最初のバージョンには要素Aがあり、2番目のバージョンにはすでにテキスト要素があります。
ここでは、フレームセット、スクリプト、タイトル...、およびそれらの異なる動作の例を示すことができますが、一般的な意味は明確だと思います。

これで、HTMLツリーを構築しないとトークンへの分解を正しく実行できないと断言できます。 したがって、HTML解析は、少なくとも2つの段階(トークン化とツリー構築)なしでは実行できません。
「厳格」、「仕様に適合しない」、「軽量」、「html 4」などの用語については、これらの用語はすべて「正しく処理されない」に簡単に置き換えることができると確信しています。 これはすべてばかげています。


どのように、また何を比較しますか?

そして、ここが最も興味深いものです。 誰もがhtmlパーサーの誇りのタイトルを運ぶことができるわけではありません。さらに、実際にhtmlトークナイザーと呼ぶ人でさえ、そうではありません。
すべてのパーサーをテーブルに置いた後、すぐに質問がありました-誰と誰を比較すればよいですか?

そして、正しいパーサーを比較します:myhtml、html5lib、html5ever、gumbo。

これらは最新の仕様に対応しており、その結果は最新のブラウザで見られるものと一致します。
間違ったパーサー(仕様に対応していない)は速度/メモリが大きく異なる可能性がありますが、これには意味があります。単にドキュメントを誤って処理するだけです。
「html 4のパーサー」などの言い訳は考慮されません。 世界は絶えず変化しており、それに追いつく必要があります。

html5everは適切なパーサーではないことに注意してください。 著者は、すべてのhtml5lin-test-tree-builderテスト、つまり、ツリー構築の正確性のテストに合格しないと書いています。 彼は正しいことを試みるために正しいパーサーに入りました。
また、執筆時点で、html5libは一部のHTML形式のツリーを正しく構築していません。 しかし、これらはすべて著者が修正したいバグです。

466個のHTMLファイルの時間/メモリを測定します-TOP500 alexa。 500ではなく466。すべてのサイトが機能するわけではなく、すべてのサイトがコンテンツを提供するわけでもないからです。

ステージを含むフォークが各ページに作成されます:
  1. 完全なパーサーの初期化
  2. 1ページの解析
  3. リソースのリリース

技術は「寿命テスト」になります-可能であれば、1つのオブジェクトですべてのページを追い出します。 これはすべて順次行われます。

テストへ!

テストに到達しました:myhtml、html5ever、gumbo。

残念ながら、html5libはテストからクラッシュしました。 予備的な実行では、それが他のものよりも著しく遅いことが示されました。 それを比較しても意味がありません。Pythonで書かれており、非常に低速です。

MyHTMLとGumboはC. html5everで記述されています-これはRustです。 私は成長するまで強くありませんが、強くなるまでアレクセイ・ウォズニウクに助けを求めました。 アレックスは(尊敬と尊敬)に同意し、パーサーをテストするためのラッパーを作成しました。

ランタイムテストの全体的な結果:


占有リソースのテストの合計結果:



100のランタイムテスト結果












占有リソースのテスト、100で除算











「人生から」のテストの結果。 1つのプロセスですべての(466)ページを実行します。
myhtml
   : 0.50890;   : 1052672;   : 32120832 

ガンボ
   : 6.12951;   : 1052672;   : 29319168 

html5ever
   : 4.50536;   : 1052672;   : 30715904 


まとめ

スピードの議論の余地のないリーダーはmyhtmlです。 ガンボは記憶のリーダーであり、驚くことではありません。 html5everは、控えめに言っても、決して姿を見せませんでした。 それは高速ではなく、メモリから特にうまく表示されておらず、Rustからのみ使用できます。

「人生から」のテストでは、記憶の違いはそれほど重要ではないことが示されましたが、速度の面では、私はとてつもなく大したことはありません。

使用されたもの

装備品
Intel®Core(TM)i7-3615QM CPU @ 2.30GHz
8 GB 1600 MHz DDR3

ソフトウェア:
Darwin MBP-Alexander 15.3.0 Darwin Kernelバージョン15.3.0:2015年12月10日18:40:58 PST; ルート:xnu-3248.30.4〜1 / RELEASE_X86_64 x86_64
Apple LLVMバージョン7.0.2(clang-700.1.81)
ターゲット:x86_64-apple-darwin15.3.0
スレッドモデル:posix

参照資料

ベンチマークコード
写真とCSV
myhtmlgumbohtml5ever
Alexeyのhtml5event結ぶ

ご清聴ありがとうございました!

PS by myhtml

myhtmlの作成者であるため、このようなテストを行うことは道徳的に困難でした。 しかし、私はこの問題に非常に責任を持ってアプローチし、各パーサーと自分のパーサーで作業することを試みました。

Source: https://habr.com/ru/post/J279409/


All Articles