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



All Articles