異なるパーサーとブラウザーによるJSON処理速度の比較

前文


1つのIPTV-STBセットトップボックスの/ミドルウェアインターフェイスを記述しているときに、evalを呼び出すときに、組み込みのOperaのjavascriptパーサーのかなり遅い操作に遭遇しました(組み込みはOperaではありませんでしたが、ANT Galioはまだ悲しいですが、これは別の議論のトピックです)。 つまり、通常、すべてがゆっくりと動作します。 それはまだ単なる接頭辞ですが、この特定のケースではブレーキと関係があります-テレビ番組はajaxを介してロードされ、evalは着信JSON文字列を解析しましたが、接頭辞はユーザーアクションにまったく応答しませんでした(そして長い間) 。 その結果、コンソールで数倍速くなったJSONPを使用して問題を解決しました(同時にクロスドメインの問題を解決しました)が、同時にパーサーのパフォーマンスについても原則的に考えました。 ハブラーでそれについての記事は1つしか見つかりませんでしたが、JSONPはそこにありませんでした...プラスコメントにいくつかの肯定的な重要な発言があったので、テストを実施することにしました。 JSON.orgのすべてのパーサーと、ブラウザーOpera 9.64、Firefox 3.5、Internet Explorer 8、Google Chrome 2、Safari 4が使用されます。


テスト方法


上記の記事へのコメントでは、ブラウザは解析結果をキャッシュできるため、信頼できる結果を得るために単純に同じ行を100回実行することはあまり正しくありません。 さらに、JSONPでの解析自体はまったくありません。JavaScript自体の解析に関するものです。
その結果、短いphpスクリプトが作成されました。これはサーバーにインストールされ、リクエストに応じて、この形式の指定された数のオブジェクトを含む配列を含むJSON文字列を生成します。
{
"key_string1" : "qkrlgthcnadzemsiuwvbfopxyj",
"key_string2" : "zbntiyjchfpsraudqxkgomvwle",
"key_int" : 25721,
"key_arr" : [21,25,19,16,10,4,27,17,6,12,22,29,5,1,26,28,23,14,24,13,3,18,30,15,2,11,8,20,9,7],
"key_float" : 2110.1
}

オブジェクトのプロパティの内容は毎回ランダムに入力され、スクリプト自体はキャッシュを防止して呼び出されます。
テスト自体のために、さまざまな方法でサーバーに配列内の異なるオブジェクト数を持つJSON文字列を要求し、ダウンロード時間と解析時間を測定するページが作成されました(JSONPの場合、一度に)。 より正確な結果を得るために、すべてのクエリが50回実行されました。 次の解析方法が使用されます。


自宅のコンピューター(Athlon64 X2 5200 +、2 GBのメモリ、Windows XP SP2)ですべてをテストし、ローカルネットワーク上の近くにあるサーバーからスクリプトを実行しました(転送遅延にわずかにプラスの効果を与えるため)。 それでも、これらの同じ転送遅延が完全に存在し(200ミリ秒の領域)、かなり大きなばらつきがあるため、テストの絶対値に焦点を合わせないでください-さまざまなパーサーとブラウザの結果の相対的な比較がはるかに重要です。 localhostでテストしようとしましたが、shttpsの下でphp-cgiを実行するとさらに遅くなり、テスト用の特別なスタンドを作成するのは少し面倒でした。
そしてブラウザについては。 2009年2月7日にブラウザサイトで入手可能な公式リリースの公式最新バージョンを使用しました。 したがって、たとえば、Operaは10番目ではありません。 IE6もありません-IETesterでしか起動できませんでしたが、そこからの結果は完全に正しいとは思えません。 テストは、各ブラウザーを起動した直後に単一のタブで実行されました。 その作業の過程で、異なるブラウザは異なる方法でプロセッサをロードし、異なる量のメモリを消費しましたが、これは別の調査のトピックです。

試験結果


結果はすべて表形式です。 すべてのパーサーについて、最初の行はミリ秒単位の合計実行時間(データ要求+解析)を示し、2番目の行(JSONPを除く)は解析のみの時間を示します。 JSONPと比較するのが理にかなっているのは最初の行のみであり、2番目の行は他のパーサー同士を比較するためだけに役立ちます。

Google Chrome 2
パーサーJSON文字列の配列内のオブジェクトの数
2550100200400800
ジョンソン187187211197213242
JSON_json2189189193200220253
JSON_json2-解析246122142
JSON_json_parse192194198212241311
JSON_json_parse-解析4611224592
JSON_json_sans_eval190190191231240259
JSON_json_sans_eval-解析136112348


Firefox 3.5
パーサーJSON文字列の配列内のオブジェクトの数
2550100200400800
ジョンソン212215219222233277
JSON_json2219224224239270384
JSON_json2-解析36122551106
JSON_json_parse223255276353529820
JSON_json_parse-解析193672145288578
JSON_json_sans_eval219225224257307365
JSON_json_sans_eval-解析58163162123
JSON_native198211219233244261
JSON_native-解析1124917


Opera 9.64
パーサーJSON文字列の配列内のオブジェクトの数
2550100200400800
ジョンソン307356371395390430
JSON_json2323332344391463693
JSON_json2-解析8163167138343
JSON_json_parse316333363438553829
JSON_json_parse-解析112254112231476
JSON_json_sans_eval311323352380436588
JSON_json_sans_eval-解析5122353114237


Internet Explorer 8
パーサーJSON文字列の配列内のオブジェクトの数
2550100200400800
ジョンソン191191198201217244
JSON_json2216204212218251220
JSON_json2-解析3511224592
JSON_json_parse2382873995238641672
JSON_json_parse-解析45901913276431443
JSON_json_sans_eval203213273306412681
JSON_json_sans_eval-解析92054107204448
JSON_native195196209201219250
JSON_native-解析11451127


Safari 4
パーサーJSON文字列の配列内のオブジェクトの数
2550100200400800
ジョンソン204228208221238280
JSON_json2198200202210232266
JSON_json2-解析12481631
JSON_json_parse224205213239273351
JSON_json_parse-解析47142856111
JSON_json_sans_eval202205211226260324
JSON_json_sans_eval-解析3510204180


UPDdeeruaは各パーサーに素敵なグラフィックを描きました-喜ぶ:

ジョンソン
g1

JSON_json2
g2

JSON_json_parse
g3

JSON_json_sans_eval
g4

JSON_native
g5

結論


一方では、結果はまったく代表的ではありません-データを返すサーバー側スクリプトを呼び出すときに、ほとんどの違いは200ミリ秒の遅延(および異なる開始間の拡散)によって隠されます。 一方、多くの結論を可能にするだけでなく、必要にすることもできます。
  1. JSONPは本当に速いです! その速度はすべてのブラウザで同じであり(Operaが私たちを失望させない限り)、スケーラビリティは他のパーサーよりもはるかに優れています。 その動作の速度は、ほとんどすべてのコンテンツに依存するサーバー自体に依存するため、結果にランダムなばらつきが生じます。 いずれにせよ、クライアントに特別なセキュリティ要件がない場合、JSONPはJSONデータの転送と解析に最適な選択です。
  2. 大量のデータ(このテストの800個のオブジェクトのファイルに約190kbかかります)について話しておらず、IEを使用している場合、他のパーサー間の時間差は特に重要ではありません。 これは、JSON解析だけでなく、完全なランタイムを指します。
  3. FFおよびIEの組み込みJSONパーサーは、解析速度の点でより良い結果を示しました。 それらが完全な安全性を提供することも考慮すると、それらを使用することは明らかに理にかなっています。
  4. Googleパーサーjson_sans_evalは、従来のevalで実行されるjson2よりもそれほど遅くありませんが、高度なセキュリティを提供します。 したがって、結果のJSONオブジェクトが使用中に別の検証を受ける場合、これが明らかに最適な妥協点になります。
  5. ブラウザのうち、ChromeとSafariが最高のパフォーマンスを発揮しました。 両方の脚が1か所から成長することを考えると、WebKitは間違いなく操縦します。 :-)
  6. OperaとFirefoxは非常に平凡なパフォーマンスを示しましたが、IE8はあいまいなパフォーマンスを発揮しました。優れたネイティブパーサーと評価作業であると同時に、ひどい「手動」行解析も行いました。 明らかに、これは遅れているjsエンジンです。


まあ、それが私以外の誰にも興味があることを願っています。 :-)あとでトランスポートコンポーネントを削除してテストを改善するかもしれませんが、パーサーとブラウザの速度を最初に評価するには、これで十分だと思います...

ps:しかし、ハブがテーブルの行にbgcolorを指定することを許可した場合、結果はより美しくなります...

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


All Articles