2016-12-06 16 views
8

私はHaskellアプリケーションを開発中で、GHCJSでコンパイルされたブラウザで動作しています。どちらのプログラムも同じHaskellデータ型定義を共有しています。私は「ちょうど」直列化形式を選択する必要があります。ウェブソケット上のGHCJSコードの最も効率的なワイヤフォーマット

簡潔にするために、プログラムはReadShowで動作しますが、明らかに理想的ではありません。

一方、ByteStringsで動作するcerealライブラリのような、高速シリアル化のための通常の競合相手が実際にGHCJSで効率的になるかどうかは不明です。さらに、GHCJSのAPIは、ByteStringsがバイナリのBlobタイプと対話するのを難しくしているようですが、WebSocketへのJavaScriptバインディングが提供します。

ジェネリックコードの生成(GHC.Genericsを使用)は良いでしょう。

誰もこの問題を解決しましたか?おそらくGHCJSのさまざまなシリアライゼーションの変種をベンチマークしましたか?

+1

私はちょうどシリアルを使用しました。私はクライアント上でreflex-frpを使用していました。これは基本的に、WebSocketをByteStringの入力イベントとByteStringの出力イベントとして表示する方法を提供していました。私は本当に特定のパフォーマンスのニーズはありませんでしたが、ベンチマークはしませんでした。私はすでに穀物を使っていたのですが、それだけでうまくいきました。 – Ben

+0

彼らのウェブソケットバインディングのために 'reflex-frp'を見てください。 –

+1

私は 'httpsを使用していたのに、私は今、思い出すん。むしろhackageより// github.com /反射-FRP /反射-platform'を、と私はそれが有意でのWebSocketのものが含まれていることを考え出しまで、私はいくつかの不満を持っていたこと当時のハッカーにリリースされたもの(数ヶ月前)とは異なります。 – Ben

答えて

1

昨年reddisキャッシュにデータを格納するためにHaskellでの高速シリアライザ/デシリアライザのライブラリーを探していましたし、最終的に我々はいるProtobufを使用して終了!これは、私たちがすでにシリアル化したいすべてのオブジェクトのProtoBuf実装を既に持っていたために部分的でしたが、パフォーマンスはシリアル/バイナリに比べてはるかに優れていました。当時、storeは存在しませんでした。

サイズおよびシリアライズ/デシリアライゼーションの速度は非常にだけでなく、あなたのデータに依存します。たとえば、あなたは小さめの多くを持っている場合は64ビット(なぜならそのbase 128 variantエンコーディングの)数字、いるProtobufあるいはJSONは私がのために固定サイズを使用して推測すること穀物またはバイナリ(より効率的かもしれない(範囲で言う1〜100)それらの値に関係なく数字)。

Typed-Wireあなたは、いくつかの言語間でのシリアル化を行うことができますが、私はそれが基礎となる実装としてJSONを使用して考えることもあります。

私はGHCJS経験がないが、私は最初storeをしようとお勧めします。クライアントとサーバーにエンディアンの互換性がほとんどない/大きなものでないことを確認してください。

+0

自動的に派生した 'store'ライブラリの' Generic'インスタンスはEndian-safeですか? –

+0

私が覚えている限り、 'store'はエンコーダーとデコーダーの両方が同じエンディアン(パフォーマンスのため)を持っていると仮定します。他のほとんどのエンコーディングライブラリはその前提をしていません。基本型のインスタンスは通常、手動で実装されるため、汎用実装を使用するかどうかは関係ありません。 – Hapal

+0

ところで、JS側のパフォーマンスを探しているなら、ネイティブなJSON実装のメリットがあります。私はGHCJSのAesonのようなものではなく、ネイティブなJSONデコーダをどのように使うことができるのかよくわかりませんが、実行可能でなければなりません。 – Hapal

関連する問題