2011-03-14 27 views
12

XML解析の多くを使用するアプリケーションを作成していますが、JSONをXMLの代替として使用できるため、JSONを使用すると考えました。JSONとDelphiのXML解析速度

どちらの方が速いJSONかXMLかをテストする必要がありますが、最初にここで意見を聞いてみることを考えました。

JavaScriptのJSONはネイティブで速いです。 XMLを解析するよりもはるかに高速です。しかし、Delphiにはそれを行うネイティブクラスはありません。

私の質問は - XMLやJSONパーサライブラリを使用してDelphiで高速ですか?それとも、スピードが同じですか?

そして、それはより速くあなたが好むどのそれでは場合 - Delphi Web UtilsJSON Delphi LibraryまたはJSON Toolkit

答えて

11

よく書かパーサーで、XMLとJSONは、多かれ少なかれ同じタイミングを持つことになります。遅いJSONパーサと高速なXMLパーサを持つことができます。

構文がJSONよりも複雑であるため、おそらくXMLの処理が遅くなる可能性があります。

しかし、ボトルネックは主にハードドライブから読み込み、コンテンツを解析することはありません。

(ちょうど私たちの小さな実験から話すが、あなたは他の人を見つけることができます、私はここで荒ししたくない)我々はいくつかの理由のために、私たちのORMのクライアント/サーバー用のJSONを使用:

  • XMLと同様に、シンプルなデータ構造や連想配列(オブジェクトと呼ばれる)を表現するための、テキストベースの人間が読める形式です。
  • 人と機械の両方で読みやすく、実装が速く、通常はXMLよりもサイズが小さいです。
  • これはデータキャッシュのための非常に効率的なフォーマットです。
  • このレイアウトは、無駄なスペースがほとんどなく、ゼロで終了する個々のUTF-8文字列に書き直すことができます。この機能は、高速なJSONからテーブルへのテキスト変換を高速化するために使用され、メモリ割り当てもデータコピーもありません;
  • これはJavaScript言語によってネイティブにサポートされているため、AJAX(つまりWeb 2.0)アプリケーションで完全なシリアライズフォーマットになります。
  • JSON形式は、よく知られた単純なRFCで指定されています。
  • JSONとORMのデフォルトのテキストエンコーディングはUTF-8で、完全なUnicode文字セットを格納して通信することができます。
  • .NET Framework 3.5以降、Windows Communication Foundation(WCF)で作成されたASP.NET AJAXサービスで使用される既定のデータ形式です。 Microsoftの公式の「準備完了」だ。
  • バイナリBLOB伝送では、XMLのようにCDATAはありません。したがって、バイナリデータをJSON文字列の内部で16進数またはBase64(より少ないスペースを使用する)としてエンコードするだけです。

構文解析の速度については、in-place parser and JSON writer from SQLite3 resultsをご覧ください。それは速度のために非常に最適化され、速いです。私たちはコレクションを含むTPersistentのためにシンプルだがefficient JSON serializationを書いた。私たちはちょうど非常に速いa dynamic array JSON serializerを追加するだけです。

追加注:彼らはJSONの内容を解析し、入力バッファ内のテキストとしてそれをフォーマットするため

これらすべてのパーサはあなたが言及したものと異なるが:解析中に作られた全くメモリ割り当てはありませんので、それはすべき他のソリューションよりも速くなります。テキストコンテンツはエスケープされず、フィールドは#0で終了し、テキストの先頭へのポインタが計算されます。したがって、値にアクセスするには、ポインターを使用してデータを取得します。通常は、時間のないJSONコンテンツのMBを解析します。

JSON parser embedded in DWSもご覧ください。著者は速いと主張した。しかし、各オブジェクトにはまだメモリブロックが割り当てられていました。

+0

インプレースJSON解析とDOM/SAX XMLパーサ技術については、http://blog.synopse.info/post/2011/06/02/Fast-JSON-parsing –

+0

@ Bouchez:あなたのJSONパーサーは、他の人が利用できるようになっていますか?はいの場合は、リンクをダウンロードしてダウンロードできますか?ありがとうございます – costa

+0

パーサーは、低レベル関数のセットとして、[SynCommons.pas unit](http://synopse.info/fossil/finfo?name=SynCommons.pas)で利用できます。私たちがmORMotでこのようなメモリやCPUを消費するプロセスを避けようとしているため、あらゆる種類のJSONコンテンツをツリーに直接変換できる上位クラスはなく、単純なオブジェクトや配列に依存しています。しかし、強力なJSONToObject()とObjectToJSON()関数があります。 –