異なるパーサーとブラウザーによる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文字列の配列内のオブジェクトの数
25 50 100 200 400 800
ジョンソン 187 187 211 197 213 242
JSON_json2 189 189 193 200 220 253
JSON_json2-解析 2 4 6 12 21 42
JSON_json_parse 192 194 198 212 241 311
JSON_json_parse-解析 4 6 11 22 45 92
JSON_json_sans_eval 190 190 191 231 240 259
JSON_json_sans_eval-解析 1 3 6 11 23 48




Firefox 3.5

パーサー JSON文字列の配列内のオブジェクトの数
25 50 100 200 400 800
ジョンソン 212 215 219 222 233 277
JSON_json2 219 224 224 239 270 384
JSON_json2-解析 3 6 12 25 51 106
JSON_json_parse 223 255 276 353 529 820
JSON_json_parse-解析 19 36 72 145 288 578
JSON_json_sans_eval 219 225 224 257 307 365
JSON_json_sans_eval-解析 5 8 16 31 62 123
JSON_native 198 211 219 233 244 261
JSON_native-解析 1 1 2 4 9 17




Opera 9.64

パーサー JSON文字列の配列内のオブジェクトの数
25 50 100 200 400 800
ジョンソン 307 356 371 395 390 430
JSON_json2 323 332 344 391 463 693
JSON_json2-解析 8 16 31 67 138 343
JSON_json_parse 316 333 363 438 553 829
JSON_json_parse-解析 11 22 54 112 231 476
JSON_json_sans_eval 311 323 352 380 436 588
JSON_json_sans_eval-解析 5 12 23 53 114 237




Internet Explorer 8

パーサー JSON文字列の配列内のオブジェクトの数
25 50 100 200 400 800
ジョンソン 191 191 198 201 217 244
JSON_json2 216 204 212 218 251 220
JSON_json2-解析 3 5 11 22 45 92
JSON_json_parse 238 287 399 523 864 1672
JSON_json_parse-解析 45 90 191 327 643 1443
JSON_json_sans_eval 203 213 273 306 412 681
JSON_json_sans_eval-解析 9 20 54 107 204 448
JSON_native 195 196 209 201 219 250
JSON_native-解析 1 1 4 5 11 27




Safari 4

パーサー JSON文字列の配列内のオブジェクトの数
25 50 100 200 400 800
ジョンソン 204 228 208 221 238 280
JSON_json2 198 200 202 210 232 266
JSON_json2-解析 1 2 4 8 16 31
JSON_json_parse 224 205 213 239 273 351
JSON_json_parse-解析 4 7 14 28 56 111
JSON_json_sans_eval 202 205 211 226 260 324
JSON_json_sans_eval-解析 3 5 10 20 41 80




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を指定することを許可した場合、結果はより美しくなります...



All Articles