8

私は、GHCJS でコンパイルされたブラウザーで実行されている Haskell アプリケーションに取り組んでいます。これは、websocket を介して、同じく Haskell で記述されたサーバーと通信します。どちらのプログラムも同じ Haskell データ型定義を共有しているため、シリアル化形式を「選択するだけ」で済みます。

現時点では、簡単にするために、プログラムはReadShowで実行されます。これは機能しますが、明らかに理想的ではありません。

一方で、高速シリアライゼーションの通常の候補であるcerealライブラリーなどで動作するByteStringsものが GHCJS で実際に効率的であるかどうかは不明です。さらに、GHCJS の API は、Websockets への JavaScript バインディングが提供するByteStringsバイナリー型と対話することを困難にしているようです。Blob

汎用コード生成 (を使用GHC.Generics) がいいでしょう。

以前にこの問題を解決した人はいますか? GHCJS でさまざまなシリアライゼーションのバリアントをベンチマークした可能性もありますか?

4

1 に答える 1

1

昨年、データを reddis キャッシュに保存するために Haskell で高速なシリアライザー/デシリアライザー ライブラリを探していましたが、最終的に ProtoBuf を使用することになりました! これは、シリアル化するすべてのオブジェクトの ProtoBuf 実装が既にあったためでもありますが、シリアル/バイナリと比較してパフォーマンスもはるかに優れていました。その時までに、は存在しませんでした。

シリアライゼーション/デシリアライゼーションのサイズと速度は、データにも大きく依存します。たとえば、小さい (たとえば 1 から 100 の範囲の) 64 ビットの数字がたくさんある場合、protobuf (ベース 128 バリアントエンコーディングのため) または JSON でさえ、シリアルやバイナリ (固定値を使用していると思います) よりも効率的である可能性があります。値に関係なく数値のサイズ)。

いくつかの言語でシリアル化できるTyped-Wireもありますが、基盤となる実装として JSON を使用していると思います。

GHCJS の経験はありませんが、store最初に試してみることをお勧めします。クライアントとサーバーにリトル/ビッグエンディアンの非互換性がないことを確認してください。

于 2016-12-07T01:22:45.847 に答える